|
11425
|
516
|
41
|
2026-05-08T19:16:43.637415+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-08/1778 /Users/lukas/.screenpipe/data/data/2026-05-08/1778267803637_m2.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
SafariBookmarksv * FavouritesiCloud© GoogleAPP DE SafariBookmarksv * FavouritesiCloud© GoogleAPP DEVChatGPTDomoy - HBO Max« Tao Grou FavouritesV_ NASam) HomePortainerNainx Proxy ManagerADDBitwarden Web vaultS, PDF Stirlingog n8nA Jellyfin88 Immich@ CRMw Gitea4 Images© DSK Uploader* owntracks recorderD Map | Dawarich@ AudiobookshelfTA) TubeArchivistBeszelbookloreF Location Loager API - Sw..O Open WebUlPaperless-ngxHostingeroP Trilium NotesLocation Logger@ Outfit Manager® Reminders> E g› E PROTONViewHistorybookmarksDevelopWindowmelpwauth.hostinger.comSign in - Google accountsG Sign in with GoogleChoose an accountto continue to Hostinger.comlukas.kovalik@jiminny.comLukás KoválikMercuryImercury351@[EMAIL] [EMAIL] another accountsigned outsigned outSigned outBefore using this app, you can review Hostinger.com'sPrivacy Policy and Terms of ServicelEnglish (United Kingdom)•1|Cestedks, however I expectged some authorization via authentik. Why is ti not there. Glve ne steps howvhat csv does uoloader exoect. Can I see do?ntik loginhe backend — but only when requests flow through NPM. Here's what's happening:168.0.242:5175 - Vite - backende's no X-authentik-username header iniected, so all protected APl calls return 401. The paget the payments table is probably empty. To confirm:ated):tectucerii [URL_WITH_CREDENTIALS] ("#6b7280")@amap ("taqs")enum Status UNPROCESSED SENT SKIPPEDenum Source { INGEST UPLOAD)Key decisions:• No User model — Authentik owns ldenuity.• currency : EUR for SMS ingest, BGN for CSV uploads.• debitBan. creditian. transactiontvpe. paverAccount : nullable csv-onlv columns: INGES. rows store nulls. Avoids aunion query for the unitied list view.•balance is alwavs nulll for CSV rows ((DSK exoort does not include runnina balance).• Fresh consolidated miaration — no data miaration from reference apps reauired..Ap RoutesMethodiPathAuthDescriptionGETJapi/healthpublicHealth checkPOST/api/payments/ingestpublicSMS or structured ingest (source=INGEST)GET/api/paymentsrequiredList with filters/sort/pagination (+ source filter)apl/payments/meta/taasrequiredAll tagsGETapi/oavments/meta/filtersrequiredFilter options incl. sources arravGETlapi/pavments/AidrequiredSinale pavmentPATCHIlapi/oavments/kidrequiredUodate statusDELETE/api/payments/:idrequiredDeletePOSTJanilnavments/-id/sendrequiredSend notificationposTJanilnavments/-id/skinrequiredSkin!DOST/api/payments/:id/tagsrequiredAdd/upsert tagDEI STS/api/payments/.id/tags/:tagldrequiredRemove tagPOSTapi/upload/csvrequiredDSK CSV file upload (source=UPLOAD)8 Sign In...
|
NULL
|
6366100426007699258
|
NULL
|
visual_change
|
ocr
|
NULL
|
SafariBookmarksv * FavouritesiCloud© GoogleAPP DE SafariBookmarksv * FavouritesiCloud© GoogleAPP DEVChatGPTDomoy - HBO Max« Tao Grou FavouritesV_ NASam) HomePortainerNainx Proxy ManagerADDBitwarden Web vaultS, PDF Stirlingog n8nA Jellyfin88 Immich@ CRMw Gitea4 Images© DSK Uploader* owntracks recorderD Map | Dawarich@ AudiobookshelfTA) TubeArchivistBeszelbookloreF Location Loager API - Sw..O Open WebUlPaperless-ngxHostingeroP Trilium NotesLocation Logger@ Outfit Manager® Reminders> E g› E PROTONViewHistorybookmarksDevelopWindowmelpwauth.hostinger.comSign in - Google accountsG Sign in with GoogleChoose an accountto continue to Hostinger.comlukas.kovalik@jiminny.comLukás KoválikMercuryImercury351@[EMAIL] [EMAIL] another accountsigned outsigned outSigned outBefore using this app, you can review Hostinger.com'sPrivacy Policy and Terms of ServicelEnglish (United Kingdom)•1|Cestedks, however I expectged some authorization via authentik. Why is ti not there. Glve ne steps howvhat csv does uoloader exoect. Can I see do?ntik loginhe backend — but only when requests flow through NPM. Here's what's happening:168.0.242:5175 - Vite - backende's no X-authentik-username header iniected, so all protected APl calls return 401. The paget the payments table is probably empty. To confirm:ated):tectucerii [URL_WITH_CREDENTIALS] ("#6b7280")@amap ("taqs")enum Status UNPROCESSED SENT SKIPPEDenum Source { INGEST UPLOAD)Key decisions:• No User model — Authentik owns ldenuity.• currency : EUR for SMS ingest, BGN for CSV uploads.• debitBan. creditian. transactiontvpe. paverAccount : nullable csv-onlv columns: INGES. rows store nulls. Avoids aunion query for the unitied list view.•balance is alwavs nulll for CSV rows ((DSK exoort does not include runnina balance).• Fresh consolidated miaration — no data miaration from reference apps reauired..Ap RoutesMethodiPathAuthDescriptionGETJapi/healthpublicHealth checkPOST/api/payments/ingestpublicSMS or structured ingest (source=INGEST)GET/api/paymentsrequiredList with filters/sort/pagination (+ source filter)apl/payments/meta/taasrequiredAll tagsGETapi/oavments/meta/filtersrequiredFilter options incl. sources arravGETlapi/pavments/AidrequiredSinale pavmentPATCHIlapi/oavments/kidrequiredUodate statusDELETE/api/payments/:idrequiredDeletePOSTJanilnavments/-id/sendrequiredSend notificationposTJanilnavments/-id/skinrequiredSkin!DOST/api/payments/:id/tagsrequiredAdd/upsert tagDEI STS/api/payments/.id/tags/:tagldrequiredRemove tagPOSTapi/upload/csvrequiredDSK CSV file upload (source=UPLOAD)8 Sign In...
|
11424
|
NULL
|
NULL
|
NULL
|
|
11437
|
515
|
41
|
2026-05-08T19:16:58.851439+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-08/1778 /Users/lukas/.screenpipe/data/data/2026-05-08/1778267818851_m1.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹ $0la6l• •sshDOCKERO 81DEV (-zsh)О ₴2APP (-zsh)-zsh• 84screenpipe"• ₴5|Adm1n@DXP4800PLUS-B5F8:~$cd /volume2/docker/finance/finance-hubsudo dockercompose up-d--build[sudo] password for Admin:WARN[0000] /volume2/docker/finance/finance-hub/docker-compose.yml: "version' is obsolete[+] Building 45.2s (21/21) FINISHED=> [backendinternal] load build definition from Dockerfile= => transferring dockerfile: 329B=> [frontend internal] load metadatafor docker.io/library/node:20-alpine=> [backend internal] load•dockerignore==> transferringcontext: 2B[frontend 1/5] FROM docker.io/library/node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293=> [backend internal] load buildcontext=> => transferring context: 32.18kB=> CACHED [backend 2/8] RUNapkadd--no-cacheopenssl=> CACHED [backend 3/8] WORKDIR/app= [backend 4/8] COPY package.json package-lock.json*=> [backend 5/8] RUN npm install[backend 6/8] COPY prisma./prisma=> [backend 7/8] RUN npx prisma generate= [backend 8/8] COPY src ./src= [backend] exporting to image= =› exporting layers=> => writingimage sha256:905d8807ca787f954b365481088c05dcfb9ced02966b3d01f322c10cea27e564= =› naming to docker.io/library/finance-hub-backend= [frontend internal] load build definition from Dockerfile= => transferring dockerfile: 204B= [frontendinternal] loaddockerignore=> transferring context: 2B=>[frontend internal] load build context= transferring context: 49.54kBCACHED [frontend 2/5] WORKDIR /app[frontend 3/5] COPY package.json package-lock.json*[frontend 4/5] RUN npm install=>[frontend 5/5] COPY[frontend]exportingto image= => exporting layers= => writingimage sha256:6b5413a30bcfd3f9d27df726ce52b3b1d9a0b6a177566122117f258ce7b958dd= namingto docker.io/library/finance-hub-frontend[+] Running 5/5• Network finance-hub_default• Volume"finance-hub_pgdata"• Container finance-hub-db-1• Container finance-hub-backend-1• Container finance-hub-frontend-1CreatedCreatedHealthyStartedStartedAdm1n@DXP4800PLUS-B5F8:/volume2/docker/finance/finance-hub$ D-zsh100% C₴68Fri 8 May 22:16:58sshT₴1docker:default0.150.051.150.0s0.0s0.0s0.150.050.0s0.0s0.2516.1s0.2s2.250.3s1.251.150.0s0.050.0s0.0s0.150.0s0.050.050.050.2521.0s0.351.[IP_ADDRESS].[IP_ADDRESS].15...
|
NULL
|
953001786503158289
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹ $0la6l• •sshDOCKERO 81DEV (-zsh)О ₴2APP (-zsh)-zsh• 84screenpipe"• ₴5|Adm1n@DXP4800PLUS-B5F8:~$cd /volume2/docker/finance/finance-hubsudo dockercompose up-d--build[sudo] password for Admin:WARN[0000] /volume2/docker/finance/finance-hub/docker-compose.yml: "version' is obsolete[+] Building 45.2s (21/21) FINISHED=> [backendinternal] load build definition from Dockerfile= => transferring dockerfile: 329B=> [frontend internal] load metadatafor docker.io/library/node:20-alpine=> [backend internal] load•dockerignore==> transferringcontext: 2B[frontend 1/5] FROM docker.io/library/node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293=> [backend internal] load buildcontext=> => transferring context: 32.18kB=> CACHED [backend 2/8] RUNapkadd--no-cacheopenssl=> CACHED [backend 3/8] WORKDIR/app= [backend 4/8] COPY package.json package-lock.json*=> [backend 5/8] RUN npm install[backend 6/8] COPY prisma./prisma=> [backend 7/8] RUN npx prisma generate= [backend 8/8] COPY src ./src= [backend] exporting to image= =› exporting layers=> => writingimage sha256:905d8807ca787f954b365481088c05dcfb9ced02966b3d01f322c10cea27e564= =› naming to docker.io/library/finance-hub-backend= [frontend internal] load build definition from Dockerfile= => transferring dockerfile: 204B= [frontendinternal] loaddockerignore=> transferring context: 2B=>[frontend internal] load build context= transferring context: 49.54kBCACHED [frontend 2/5] WORKDIR /app[frontend 3/5] COPY package.json package-lock.json*[frontend 4/5] RUN npm install=>[frontend 5/5] COPY[frontend]exportingto image= => exporting layers= => writingimage sha256:6b5413a30bcfd3f9d27df726ce52b3b1d9a0b6a177566122117f258ce7b958dd= namingto docker.io/library/finance-hub-frontend[+] Running 5/5• Network finance-hub_default• Volume"finance-hub_pgdata"• Container finance-hub-db-1• Container finance-hub-backend-1• Container finance-hub-frontend-1CreatedCreatedHealthyStartedStartedAdm1n@DXP4800PLUS-B5F8:/volume2/docker/finance/finance-hub$ D-zsh100% C₴68Fri 8 May 22:16:58sshT₴1docker:default0.150.051.150.0s0.0s0.0s0.150.050.0s0.0s0.2516.1s0.2s2.250.3s1.251.150.0s0.050.0s0.0s0.150.0s0.050.050.050.2521.0s0.351.[IP_ADDRESS].[IP_ADDRESS].15...
|
11436
|
NULL
|
NULL
|
NULL
|
|
11553
|
518
|
41
|
2026-05-09T06:38:39.956968+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778308719956_m2.jpg...
|
Code
|
Design new payment-logge… — finance [SSH: nas]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: finance [SSH: nas]
Explorer Section: finance [SSH: nas]
FINANCE [SSH: NAS]
finance
!
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
docker-compose.yml, Editor Group 1
.env, Editor Group 1
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
Design new payment-logge…, Editor Group 2
finance-hub — Implementation Plan, Editor Group 3
alert Disconnected from SSH: nas
Disconnected from SSH: nas
No Problems
0
0
No Ports Forwarded
0
Notifications
Sign In
Sign In
Info: Setting up SSH Host nas: (details) Initializing VS Code Server
Design new payment-logger and dsk-uploader hybrid app
Session history
New session
Message actions
payments.js
payments.js
ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.
Thinking
Thinking
I'll explore all three reference projects in parallel to understand their structure before planning.
Agent:
Explore payment-logger app structure and functionality
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How data flows (ingest, storage, retrieval)
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.
Agent:
Explore dsk-uploader app structure and functionality
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How file uploads work - what files, what format, how parsed
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.
Agent:
Explore auth folder and authentik integration
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. What auth system is being used (Authentik)
2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?
3. Middleware - how is auth enforced on routes?
4. Any frontend auth flow - login redirect, token handling, protected routes
5. Environment variables related to auth
6. Docker/deployment setup for the auth service itself
7. Any example of how other apps integrate with this auth
Report with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.
Message actions
payments.js
payments.js
continue
Thinking
Thinking
Launching parallel exploration of all three reference projects.
Agent:
Explore payment-logger app structure
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How data is ingested (look at /ingest route especially)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Bash
IN
find /volume2/docker/finance/payments-logger -type f -name "*.json" -o -name "*.js" -o -name "*.jsx" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.sql" -o -name "Dockerfile*" -o -name "docker-compose*" -o -name ".env*" 2>/dev/null | head -50
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/.env
/volume2/docker/finance/payments-logger/.env.example
/volume2/docker/finance/payments-logger/docker-compose.yml
/volume2/docker/finance/payments-logger/.claude/settings.local.json
/volume2/docker/finance/payments-logger/backend/Dockerfile
/volume2/docker/finance/payments-logger/backend/package.json
/volume2/docker/finance/payments-logger/frontend/Dockerfile
/volume2/docker/finance/payments-logger/frontend/package.json
/volume2/docker/finance/payments-logger/frontend/postcss.config.js
/volume2/docker/finance/payments-logger/frontend/tailwind.config.js
/volume2/docker/finance/payments-logger/frontend/vite.config.js
/volume2/docker/finance/payments-logger/auth/.env
/volume2/docker/finance/payments-logger/auth/.env.example
/volume2/docker/finance/payments-logger/backend/src/auth.js
/volume2/docker/finance/payments-logger/backend/src/index.js
/volume2/docker/finance/payments-logger/backend/src/parser.js
/volume2/docker/finance/payments-logger/frontend/src/App.jsx
/volume2/docker/finance/payments-logger/frontend/src/auth.js
/volume2/docker/finance/payments-logger/frontend/src/main.jsx
/volume2/docker/finance/payments-logger/backend/src/routes/payments.js
/volume2/docker/finance/payments-logger/frontend/src/components/AuthProvider.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentCard.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentList.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260210_init/migration.sql
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260210_simplify/migration.sql
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260222_add_card/migration.sql
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260508_add_users/migration.sql
Agent:
Explore dsk-uploader app structure
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How file uploads work (what format, what processing happens)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Bash
IN
find /volume2/docker/finance/dsk-uploader -type f -name "*.json" -o -type f -name "*.yml" -o -type f -name "*.yaml" | head -30
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader/docker-compose.yml
Bash
IN
cd /volume2/docker/finance/payments-logger && find . -type f \( -name "*.json" -o -name "*.js" -o -name "*.jsx" -o -name "*.ts" -o -name "*.tsx" -o -name "*.sql" -o -name "*.yml" -o -name "*.yaml" -o -name "Dockerfile*" -o -name ".env*" \) | grep -v node_modules | sort
Copy code to clipboard
OUT
./auth/.env
./auth/.env.example
./backend/Dockerfile
./backend/package.json
./backend/prisma/migrations/20260210_init/migration.sql
./backend/prisma/migrations/20260210_simplify/migration.sql
./backend/prisma/migrations/20260222_add_card/migration.sql
./backend/prisma/migrations/20260508_add_users/migration.sql
./backend/src/auth.js
./backend/src/index.js
./backend/src/parser.js
./backend/src/routes/payments.js
./.claude/settings.local.json
./docker-compose.yml
./.env
./.env.example
./frontend/Dockerfile
./frontend/package.json
./frontend/postcss.config.js
./frontend/src/App.jsx
./frontend/src/auth.js
./frontend/src/components/AuthProvider.jsx
./frontend/src/components/FilterBar.jsx
./frontend/src/components/PaymentCard.jsx
./frontend/src/components/PaymentList.jsx
./frontend/src/components/PaymentTable.jsx
./frontend/src/main.jsx
./frontend/tailwind.config.js
./frontend/vite.config.js
Agent:
Explore auth project structure
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. What authentication system is used (authentik integration details)
3. How OAuth/OIDC flow works
4. Any middleware or helper functions for protecting routes
5. Session management approach
6. How frontend handles auth state
7. Any example of how other apps integrate with this auth system
8. Docker setup and environment variables
Please read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.
Bash
IN
cd /volume2/docker/finance/dsk-uploader && find . -type f | head -100
Copy code to clipboard
OUT
./.gitignore
./README.md
./USAGE.md
./app.py
./app_flask.py
./dskuploader.py
./requirements.txt
./.env
./.env.example
./Dockerfile
./docker-compose.yml
./.dockerignore
./.git/description
./.git/packed-refs
./.git/HEAD
./.git/FETCH_HEAD
./.git/index
./.git/COMMIT_EDITMSG
./.git/ORIG_HEAD
./notion_connector/__init__.py
./notion_connector/client.py
./templates/base.html
./templates/index.html
./templates/result.html
./notion_connector/resources/__init__.py
./notion_connector/resources/block.py
./notion_connector/resources/block_property.py
./notion_connector/resources/database.py
./notion_connector/resources/database_property.py
./notion_connector/resources/filter_builder.py
./notion_connector/resources/page.py
./notion_connector/resources/page_property.py
./notion_connector/resources/search.py
./.git/info/exclude
./.git/hooks/post-update.sample
./.git/hooks/pre-applypatch.sample
./.git/hooks/pre-commit.sample
./.git/hooks/applypatch-msg.sample
./.git/hooks/pre-rebase.sample
./.git/hooks/pre-merge-commit.sample
./.git/hooks/update.sample
./.git/hooks/pre-push.sample
./.git/hooks/push-to-checkout.sample
./.git/hooks/prepare-commit-msg.sample
./.git/hooks/commit-msg.sample
./.git/hooks/pre-receive.sample
./.git/hooks/fsmonitor-watchman.sample
./.git/logs/HEAD
./notion_connector/exceptions/__init__.py
./notion_connector/exceptions/exceptions.py
./.git/config
./.git/refs/heads/main
./.git/refs/remotes/origin/HEAD
./.git/refs/remotes/origin/main
./.git/objects/7c/3f071fef98751a68b7d93779f76cf5d5aa8ebf
./.git/objects/ed/8e93af8cc77c7a85f87a9f37573c51b839e571
./.git/objects/7b/2d7b18213f9516ec4544f309772ee4808146bb
./.git/objects/65/386fd3b4ac62094500e21c23845d05b9d18a4f
./.git/objects/ee/3d5f92e57deec809abda371386e371f32de9bb
./.git/logs/refs/heads/main
./.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.pack
./.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.idx
./.git/objects/85/b5483672f68c327c39ea8c29e94ae8b22b7bbf
./.git/objects/f3/98248da8f4911d463d9a33155fcf58a65092cc
./.git/objects/0b/918bed65202bedaa9fa092e539d607be2eea65
./.git/objects/8e/a1cbf78eae8a86c5990d0582db1847c0226b56
./.git/objects/11/b908125d2f0feebf7aca6d24e127f334bce611
./.git/objects/56/a2766ae5422b18e5b1a418fd231ad12fef08e6
./.git/logs/refs/remotes/origin/HEAD
./.git/logs/refs/remotes/origin/main
Bash
IN
find /volume2/docker/finance/auth -type f -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.json" -o -name "*.yaml" -o -name "*.yml" -o -name "*.env*" -o -name "Dockerfile*" | head -100
Copy code to clipboard
OUT
/volume2/docker/finance/auth/.env
/volume2/docker/finance/auth/.env.example
/volume2/docker/finance/auth/docker-compose.yml
/volume2/docker/finance/auth/auth/.env
/volume2/docker/finance/auth/auth/.env.example
/volume2/docker/finance/auth/auth/docker-compose.yml
Read
dsk-uploader
dsk-uploader
Read
docker-compose.yml
docker-compose.yml
Read
package.json
package.json
Read
package.json
package.json
Read
.env.example
.env.example
Bash
IN
ls -la /volume2/docker/finance/auth/ && echo "---" && find /volume2/docker/finance/auth -type d | sort
Copy code to clipboard
OUT
total 20
drwxrwxrwx 1 Adm1n admin 108 May 8 21:08 .
drwxrwxrwx 1 Adm1n admin 62 May 8 21:10 ..
drwxrwxrwx 1 Adm1n admin 128 May 8 21:08 auth
drwxrwxrwx 1 Adm1n admin 0 May 8 21:06 certs
drwxrwxrwx 1 Adm1n admin 0 May 8 21:06 db
-rwxrwxrwx 1 Adm1n admin 3328 May 8 21:07 docker-compose.yml
-rwxrwxrwx 1 Adm1n admin 949 May 8 21:06 .env
-rwxrwxrwx 1 Adm1n admin 2258 May 8 21:06 .env.example
-rwxrwxrwx 1 Adm1n admin 5501 May 8 21:07 README.md
---
/volume2/docker/finance/auth
/volume2/docker/finance/auth/auth
/volume2/docker/finance/auth/auth/certs
/volume2/docker/finance/auth/auth/db
/volume2/docker/finance/auth/auth/db/base
/volume2/docker/finance/auth/auth/db/base/1
/volume2/docker/finance/auth/auth/db/base/16384
/volume2/docker/finance/auth/auth/db/base/4
/volume2/docker/finance/auth/auth/db/base/5
/volume2/docker/finance/auth/auth/db/global
/volume2/docker/finance/auth/auth/db/pg_commit_ts
/volume2/docker/finance/auth/auth/db/pg_dynshmem
/volume2/docker/finance/auth/auth/db/pg_logical
/volume2/docker/finance/auth/auth/db/pg_logical/mappings
/volume2/docker/finance/auth/auth/db/pg_logical/snapshots
/volume2/docker/finance/auth/auth/db/pg_multixact
/volume2/docker/finance/auth/auth/db/pg_multixact/members
/volume2/docker/finance/auth/auth/db/pg_multixact/offsets
/volume2/docker/finance/auth/auth/db/pg_notify
/volume2/docker/finance/auth/auth/db/pg_replslot
/volume2/docker/finance/auth/auth/db/pg_serial
/volume2/docker/finance/auth/auth/db/pg_snapshots
/volume2/docker/finance/auth/auth/db/pg_stat
/volume2/docker/finance/auth/auth/db/pg_stat_tmp
/volume2/docker/finance/auth/auth/db/pg_subtrans
/volume2/docker/finance/auth/auth/db/pg_tblspc
/volume2/docker/finance/auth/auth/db/pg_twophase
/volume2/docker/finance/auth/auth/db/pg_wal
/volume2/docker/finance/auth/auth/db/pg_wal/archive_status
/volume2/docker/finance/auth/auth/db/pg_xact
/volume2/docker/finance/auth/auth/media
/volume2/docker/finance/auth/auth/templates
/volume2/docker/finance/auth/certs
/volume2/docker/finance/auth/db
Read
README.md
README.md
Read
requirements.txt
requirements.txt
Read
index.js
index.js
Read
payments.js
payments.js
Read
auth.js
auth.js
Read
README.md
README.md
Read
.env
.env
Read
.env.example
.env.example
Read
docker-compose.yml
docker-compose.yml
Read
parser.js
parser.js
Bash
IN
find /volume2/docker/finance/auth/auth -type f | grep -v "^/volume2/docker/finance/auth/auth/db" | grep -v "^/volume2/docker/finance/auth/auth/certs" | grep -v "^/volume2/docker/finance/auth/auth/media" | sort
Copy code to clipboard
OUT
/volume2/docker/finance/auth/auth/docker-compose.yml
/volume2/docker/finance/auth/auth/.env
/volume2/docker/finance/auth/auth/.env.example
/volume2/docker/finance/auth/auth/README.md
Read
migration.sql
migration.sql
Read
migration.sql
migration.sql
Read
README.md
README.md
Read
.env
.env
Read
.env.example
.env.example
Read
docker-compose.yml
docker-compose.yml
Read
App.jsx
App.jsx
Read
main.jsx
main.jsx
Read
auth.js
auth.js
Bash
IN
find /volume2/docker/finance -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.tsx" 2>/dev/null | head -50
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader/app.py
/volume2/docker/finance/dsk-uploader/app_flask.py
/volume2/docker/finance/dsk-uploader/dskuploader.py
/volume2/docker/finance/payments-logger/frontend/postcss.config.js
/volume2/docker/finance/payments-logger/frontend/tailwind.config.js
/volume2/docker/finance/payments-logger/frontend/vite.config.js
/volume2/docker/finance/dsk-uploader/notion_connector/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/client.py
/volume2/docker/finance/payments-logger/backend/src/auth.js
/volume2/docker/finance/payments-logger/backend/src/index.js
/volume2/docker/finance/payments-logger/backend/src/parser.js
/volume2/docker/finance/payments-logger/frontend/src/auth.js
/volume2/docker/finance/dsk-uploader/notion_connector/resources/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/block.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/block_property.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/database.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/database_property.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/filter_builder.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/page.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/page_property.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/search.py
/volume2/docker/finance/payments-logger/backend/src/routes/payments.js
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/exceptions.py
Read
AuthProvider.jsx
AuthProvider.jsx
Read
PaymentTable.jsx
PaymentTable.jsx
Read
FilterBar.jsx
FilterBar.jsx
Read
auth.js
auth.js
Read
auth.js
auth.js
Read
index.js
index.js
Read
Dockerfile
Dockerfile
Read
Dockerfile
Dockerfile
Read
migration.sql
migration.sql
Bash
IN
find /volume2/docker/finance/payments-logger -name "docker-compose.yml" -o -name ".env*" -o -name "package.json" | head -20
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/.env
/volume2/docker/finance/payments-logger/.env.example
/volume2/docker/finance/payments-logger/docker-compose.yml
/volume2/docker/finance/payments-logger/backend/package.json
/volume2/docker/finance/payments-logger/frontend/package.json
/volume2/docker/finance/payments-logger/auth/.env
/volume2/docker/finance/payments-logger/auth/.env.example
Bash
IN
find /volume2/docker/finance/payments-logger -name "schema.prisma" -type f
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma
Read
docker-compose.yml
docker-compose.yml
Read
.env
.env
Read
.env.example
.env.example
Read
schema.prisma
schema.prisma
Bash
IN
ls -la /volume2/docker/finance/payments-logger/auth/ && echo "---" && find /volume2/docker/finance/payments-logger -name "Dockerfile*" | head -10
Copy code to clipboard
OUT
total 16
drwxrwxrwx 1 Adm1n admin 64 May 8 21:07 .
drwxrwxrwx 1 Adm1n admin 170 May 8 21:07 ..
drwxrwxrwx 1 Adm1n admin 0 May 8 21:07 certs
drwxrwxrwx 1 Adm1n admin 0 May 8 21:07 db
-rwxrwxrwx 1 Adm1n admin 949 May 8 21:07 .env
-rwxrwxrwx 1 Adm1n admin 2258 May 8 21:07 .env.example
-rwxrwxrwx 1 Adm1n admin 5501 May 8 21:07 README.md
---
/volume2/docker/finance/payments-logger/backend/Dockerfile
/volume2/docker/finance/payments-logger/frontend/Dockerfile
Bash
IN
cd /volume2/docker/finance/payments-logger && tree -L 3 -I 'node_modules|.next|dist|build' --charset ascii 2>/dev/null || find . -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -type f | head -60
Copy code to clipboard
OUT
.
|-- API.md
|-- auth
| |-- certs
| |-- db
| `-- README.md
|-- backend
| |-- Dockerfile
| |-- package.json
| |-- prisma
| | |-- migrations
| | `-- schema.prisma
| `-- src
| |-- auth.js
| |-- index.js
| |-- parser.js
| `-- routes
|-- docker-compose.yml
|-- frontend
| |-- Dockerfile
| |-- index.html
| |-- package.json
| |-- postcss.config.js
| |-- src
| | |-- App.jsx
| | |-- auth.js
| | |-- components
| | |-- index.css
| | `-- main.jsx
| |-- tailwind.config.js
| `-- vite.config.js
`-- README.md
12 directories, 20 files
Read
.env
.env
Read
.env.example
.env.example
Read
Dockerfile
Dockerfile
Read
Dockerfile
Dockerfile
Bash
IN
head -100 /volume2/docker/finance/payments-logger/backend/package.json && echo "---FRONTEND---" && head -100 /volume2/docker/finance/payments-logger/frontend/package.json
Copy code to clipboard
OUT
{
"name": "payments-logger-backend",
"version": "1.0.0",
"description": "Payment SMS logger backend",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js",
"prisma:generate": "prisma generate",
"prisma:migrate": "prisma migrate deploy",
"prisma:migrate:dev": "prisma migrate dev"
},
"dependencies": {
"@prisma/client": "^5.22.0",
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"express": "^4.21.1",
"express-rate-limit": "^7.4.0",
"jose": "^5.9.6",
"morgan": "^1.10.0"
},
"devDependencies": {
"nodemon": "^3.1.7",
"prisma": "^5.22.0"
}
}
---FRONTEND---
{
"name": "payments-logger-frontend",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"lucide-react": "^0.460.0",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
"devDependencies": {
"@types/react": "^18.3.12",
"@vitejs/plugin-react": "^4.3.4",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"vite": "^6.0.1"
}
}
Read
payments.js
payments.js
Bash
IN
find /volume2/docker/finance -name "*.md" -type f | xargs grep -l "auth\|Authentik\|OAuth\|OIDC" 2>/dev/null | head -5
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/API.md
/volume2/docker/finance/auth/README.md
/volume2/docker/finance/auth/auth/README.md
/volume2/docker/finance/payments-logger/auth/README.md
Read
API.md
API.md
Bash
IN
head -50 /volume2/docker/finance/payments-logger/frontend/src/main.jsx
Copy code to clipboard
OUT
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { AuthProvider } from './components/AuthProvider';
import './index.css';
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<AuthProvider>
<App />
</AuthProvider>
</React.StrictMode>
);
Bash
IN
find /volume2/docker/finance/payments-logger/frontend/src -name "*.jsx" -o -name "*.js" | head -20
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/frontend/src/App.jsx
/volume2/docker/finance/payments-logger/frontend/src/auth.js
/volume2/docker/finance/payments-logger/frontend/src/main.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/AuthProvider.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentCard.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentList.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx
Read
AuthProvider.jsx
AuthProvider.jsx
Read
AuthProvider.jsx
AuthProvider.jsx
Bash
IN
head -50 /volume2/docker/finance/payments-logger/frontend/src/App.jsx
Copy code to clipboard
OUT
import React, { useState, useEffect, useCallback } from 'react';
import { CreditCard, RefreshCw, LogOut } from 'lucide-react';
import FilterBar from './components/FilterBar';
import PaymentTable from './components/PaymentTable';
import { useAuth } from './components/AuthProvider';
const API_BASE = '/api/payments';
export default function App() {
const { logout, getToken } = useAuth();
const [payments, setPayments] = useState([]);
const [total, setTotal] = useState(0);
const [page, setPage] = useState(1);
const [filters, setFilters] = useState({});
const [sortBy, setSortBy] = useState('createdAt');
const [sortDir, setSortDir] = useState('desc');
const [filterOptions, setFilterOptions] = useState({ types: [], recipients: [], tags: [] });
const [loading, setLoading] = useState(false);
const authFetch = useCallback(async (url, options = {}) => {
const token = await getToken();
const headers = { ...(options.headers || {}) };
if (token) headers['Authorization'] = `Bearer ${token}`;
return fetch(url, { ...options, headers });
}, [getToken]);
const fetchPayments = useCallback(async () => {
setLoading(true);
try {
const params = new URLSearchParams();
params.set('page', page);
params.set('limit', 50);
params.set('sortBy', sortBy);
params.set('sortDir', sortDir);
Object.entries(filters).forEach(([key, val]) => {
if (val) params.set(key, val);
});
const res = await authFetch(`${API_BASE}?${params}`);
const data = await res.json();
setPayments(data.payments || []);
setTotal(data.total || 0);
} catch (err) {
console.error('Failed to fetch payments:', err);
} finally {
setLoading(false);
}
}, [page, filters, sortBy, sortDir, authFetch]);
const fetchFilterOptions = useCallback(async () => {
try {
Read
docker-compose.yml
docker-compose.yml
Read
Dockerfile
Dockerfile
Read
.env.example
.env.example
Read
app.py
app.py
Read
app_flask.py
app_flask.py
Read
dskuploader.py
dskuploader.py
Read
client.py
client.py
Read
database.py
database.py
Read
index.html
index.html
Read
base.html
base.html
Read
result.html
result.html
Read
page_property.py
page_property.py
Read
USAGE.md
USAGE.md
Bash
IN
find /volume2/docker/finance/dsk-uploader -type f \( -name "*.py" -o -name "*.json" \) | grep -E "(exceptions|page\.py)" | head -10
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/exceptions.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/page.py
Read
page.py
page.py
Read
exceptions.py
exceptions.py
Bash
IN
tree -L 3 /volume2/docker/finance/dsk-uploader 2>/dev/null | head -80 || find /volume2/docker/finance/dsk-uploader -type d -not -path '.*/.git/*' | sort
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader
├── app_flask.py
├── app.py
├── docker-compose.yml
├── Dockerfile
├── dskuploader.py
├── notion_connector
│ ├── client.py
│ ├── exceptions
│ │ ├── exceptions.py
│ │ └── __init__.py
│ ├── __init__.py
│ └── resources
│ ├── block_property.py
│ ├── block.py
│ ├── database_property.py
│ ├── database.py
│ ├── filter_builder.py
│ ├── __init__.py
│ ├── page_property.py
│ ├── page.py
│ └── search.py
├── README.md
├── requirements.txt
├── templates
│ ├── base.html
│ ├── index.html
│ └── result.html
└── USAGE.md
5 directories, 24 files
Read
README.md
README.md
Read
API.md
API.md
Thinking
Thinking
Now I have a complete picture of all three. Let me design the plan.
Agent:
Design combined app architecture
IN
Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:
---
## App 1: payments-logger (Node.js)
- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI
- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS
- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage
- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)
- **Schema** (PostgreSQL via Prisma):
- `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at
- `tags` table: id, name, color — M2M with payments via `_PaymentToTag`
- `users` table: id, username, hashed_password (this will be REMOVED)
- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system
- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance
## App 2: dsk-uploader (Python/Flask)
- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database
- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5
- **Auth**: None (open)
- **CSV format** (DSK Bank Bulgarian format, columns):
- `Дата` (date, DD.MM.YYYY)
- `Вид на трансакцията` (transaction type, Bulgarian)
- `Основание` (reason/description — contains card number regex: `^\d{6}x{6}\d{4}$`)
- `Дебит BGN` (debit amount, may be empty)
- `Кредит BGN` (credit amount, may be empty)
- `Наредител/Получател` (orderer/recipient name)
- `Номер сметка на наредителя / получателя` (account number)
- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers
- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)
## App 3: auth (Authentik)
- **Mode**: Proxy mode via NPM (forward auth)
- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:
- `X-authentik-username`
- `X-authentik-email`
- `X-authentik-groups`
- **No code integration needed** in the app itself — just trust these headers from NPM
- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`
---
## What the New Combined App Must Do
1. **Single PostgreSQL database** for all transactions
2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST
3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema
4. **Unified UI** — show all payments in one table regardless of source
5. **Source indicator** in UI — badge showing "INGEST", "UPLOAD", or "BOTH" (if duplicate detection added)
6. **Source filter** in FilterBar — filter by All/Ingest/Upload
7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM
8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination
9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL
---
## Technical Constraints
- Keep Node.js backend (not Python) — extend payments-logger's stack
- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)
- File upload: use `multer` npm middleware
- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)
- Add `source` enum field (INGEST/UPLOAD) to payments schema
- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is
- Remove `users` table from schema
---
## Please Design
1. Complete folder structure for the new app (suggest name: "finance-hub" or similar — note this is a placeholder, user will confirm)
2. Prisma schema with new fields (`source`, `currency`)
3. All backend API routes
4. CSV parser design in Node.js (port of the Python logic)
5. Authentik auth middleware
6. Frontend component structure (React) — what's reused from payments-logger, what's new
7. Docker Compose setup
8. Environment variables needed
9. Step-by-step implementation order
10. Verification checklist
Be specific about file paths and code structure. This will be used to write actual implementation code.
Bash
List all files in finance directory
IN
find /volume2/docker/finance -type f | sort | head -100
Copy code to clipboard
OUT
/volume2/docker/finance/auth/auth/db/base/1/112
/volume2/docker/finance/auth/auth/db/base/1/113
/volume2/docker/finance/auth/auth/db/base/1/1247
/volume2/docker/finance/auth/auth/db/base/1/1247_fsm
/volume2/docker/finance/auth/auth/db/base/1/1247_vm
/volume2/docker/finance/auth/auth/db/base/1/1249
/volume2/docker/finance/auth/auth/db/base/1/1249_fsm
/volume2/docker/finance/auth/auth/db/base/1/1249_vm
/volume2/docker/finance/auth/auth/db/base/1/1255
/volume2/docker/finance/auth/auth/db/base/1/1255_fsm
/volume2/docker/finance/auth/auth/db/base/1/1255_vm
/volume2/docker/finance/auth/auth/db/base/1/1259
/volume2/docker/finance/auth/auth/db/base/1/1259_fsm
/volume2/docker/finance/auth/auth/db/base/1/1259_vm
/volume2/docker/finance/auth/auth/db/base/1/13457
/volume2/docker/finance/auth/auth/db/base/1/13457_fsm
/volume2/docker/finance/auth/auth/db/base/1/13457_vm
/volume2/docker/finance/auth/auth/db/base/1/13460
/volume2/docker/finance/auth/auth/db/base/1/13461
/volume2/docker/finance/auth/auth/db/base/1/13462
/volume2/docker/finance/auth/auth/db/base/1/13462_fsm
/volume2/docker/finance/auth/auth/db/base/1/13462_vm
/volume2/docker/finance/auth/auth/db/base/1/13465
/volume2/docker/finance/auth/auth/db/base/1/13466
/volume2/docker/finance/auth/auth/db/base/1/13467
/volume2/docker/finance/auth/auth/db/base/1/13467_fsm
/volume2/docker/finance/auth/auth/db/base/1/13467_vm
/volume2/docker/finance/auth/auth/db/base/1/13470
/volume2/docker/finance/auth/auth/db/base/1/13471
/volume2/docker/finance/auth/auth/db/base/1/13472
/volume2/docker/finance/auth/auth/db/base/1/13472_fsm
/volume2/docker/finance/auth/auth/db/base/1/13472_vm
/volume2/docker/finance/auth/auth/db/base/1/13475
/volume2/docker/finance/auth/auth/db/base/1/13476
/volume2/docker/finance/auth/auth/db/base/1/1417
/volume2/docker/finance/auth/auth/db/base/1/1418
/volume2/docker/finance/auth/auth/db/base/1/174
/volume2/docker/finance/auth/auth/db/base/1/175
/volume2/docker/finance/auth/auth/db/base/1/2187
/volume2/docker/finance/auth/auth/db/base/1/2224
/volume2/docker/finance/auth/auth/db/base/1/2228
/volume2/docker/finance/auth/auth/db/base/1/2328
/volume2/docker/finance/auth/auth/db/base/1/2336
/volume2/docker/finance/auth/auth/db/base/1/2337
/volume2/docker/finance/auth/auth/db/base/1/2579
/volume2/docker/finance/auth/auth/db/base/1/2600
/volume2/docker/finance/auth/auth/db/base/1/2600_fsm
/volume2/docker/finance/auth/auth/db/base/1/2600_vm
/volume2/docker/finance/auth/auth/db/base/1/2601
/volume2/docker/finance/auth/auth/db/base/1/2601_fsm
/volume2/docker/finance/auth/auth/db/base/1/2601_vm
/volume2/docker/finance/auth/auth/db/base/1/2602
/volume2/docker/finance/auth/auth/db/base/1/2602_fsm
/volume2/docker/finance/auth/auth/db/base/1/2602_vm
/volume2/docker/finance/auth/auth/db/base/1/2603
/volume2/docker/finance/auth/auth/db/base/1/2603_fsm
/volume2/docker/finance/auth/auth/db/base/1/2603_vm
/volume2/docker/finance/auth/auth/db/base/1/2604
/volume2/docker/finance/auth/auth/db/base/1/2605
/volume2/docker/finance/auth/auth/db/base/1/2605_fsm
/volume2/docker/finance/auth/auth/db/base/1/2605_vm
/volume2/docker/finance/auth/auth/db/base/1/2606
/volume2/docker/finance/auth/auth/db/base/1/2606_fsm
/volume2/docker/finance/auth/auth/db/base/1/2606_vm
/volume2/docker/finance/auth/auth/db/base/1/2607
/volume2/docker/finance/auth/auth/db/base/1/2607_fsm
/volume2/docker/finance/auth/auth/db/base/1/2607_vm
/volume2/docker/finance/auth/auth/db/base/1/2608
/volume2/docker/finance/auth/auth/db/base/1/2608_fsm
/volume2/docker/finance/auth/auth/db/base/1/2608_vm
/volume2/docker/finance/auth/auth/db/base/1/2609
/volume2/docker/finance/auth/auth/db/base/1/2609_fsm
/volume2/docker/finance/auth/auth/db/base/1/2609_vm
/volume2/docker/finance/auth/auth/db/base/1/2610
/volume2/docker/finance/auth/auth/db/base/1/2610_fsm
/volume2/docker/finance/auth/auth/db/base/1/2610_vm
/volume2/docker/finance/auth/auth/db/base/1/2611
/volume2/docker/finance/auth/auth/db/base/1/2612
/volume2/docker/finance/auth/auth/db/base/1/2612_fsm
/volume2/docker/finance/auth/auth/db/base/1/2612_vm
/volume2/docker/finance/auth/auth/db/base/1/2613
/volume2/docker/finance/auth/auth/db/base/1/2615
/volume2/docker/finance/auth/auth/db/base/1/2615_fsm
/volume2/docker/finance/auth/auth/db/base/1/2615_vm
/volume2/docker/finance/auth/auth/db/base/1/2616
/volume2/docker/finance/auth/auth/db/base/1/2616_fsm
/volume2/docker/finance/auth/auth/db/base/1/2616_vm
/volume2/docker/finance/auth/auth/db/base/1/2617
/volume2/docker/finance/auth/auth/db/base/1/2617_fsm
/volume2/docker/finance/auth/auth/db/base/1/2617_vm
/volume2/docker/finance/auth/auth/db/base/1/2618
/volume2/docker/finance/auth/auth/db/base/1/2618_fsm
/volume2/docker/finance/auth/auth/db/base/1/2618_vm
/volume2/docker/finance/auth/auth/db/base/1/2619
/volume2/docker/finance/auth/auth/db/base/1/2619_fsm
/volume2/docker/finance/auth/auth/db/base/1/2619_vm
/volume2/docker/finance/auth/auth/db/base/1/2620
/volume2/docker/finance/auth/auth/db/base/1/2650
/volume2/docker/finance/auth/auth/db/base/1/2651
/volume2/docker/finance/auth/auth/db/base/1/2652
Bash
List docker directory contents
IN
ls -la /volume2/docker/
Copy code to clipboard
OUT
total 40
drwxrwxrwx 1 root root 1160 May 8 21:05 .
drwxr-xr-x 1 root root 246 Apr 6 19:54 ..
drwxrwxrwx 1 Adm1n admin 20 Jul 28 2025 adguard
drwxrwxrwx 1 Adm1n admin 66 Apr 5 13:14 ai-stack
drwxrwxrwx 1 Adm1n admin 12 Aug 1 2025 app-db
drwxrwxr-x 1 appflowy users 138 Dec 14 18:21 appflowy
drwxrwxrwx 1 Adm1n admin 72 May 6 14:55 audiobookshelf
drwxrwxrwx 1 Adm1n admin 128 Mar 30 19:52 auth
drwxrwxrwx 1 Adm1n admin 102 May 8 21:02 beszel
drwxrwxrwx 1 Adm1n admin 38 Jun 16 2025 bitwarden
drwxrwxrwx 1 Adm1n admin 36 Aug 25 2025 dawarich
drwxrwxrwx 1 Adm1n admin 322 Aug 15 2025 dsk-uploader
-rwxrwxrwx 1 Adm1n admin 10244 Oct 29 2025 .DS_Store
drwxrwxrwx 1 Adm1n admin 62 May 8 21:10 finance
drwxrwxrwx 1 Adm1n admin 92 Aug 19 2025 flask-app
drwxrwxrwx 1 Adm1n admin 308 Oct 7 2025 garmin-connector
drwxrwxrwx 1 Adm1n admin 12 Jul 18 2025 gitea
drwxrwxrwx 1 Adm1n admin 0 Feb 16 19:30 health
drwxrwxrwx 1 Adm1n admin 220 Feb 16 21:09 health-tracker
drwxrwxrwx 1 Adm1n admin 0 Oct 31 2025 homarr
drwxrwxrwx 1 Adm1n admin 146 Mar 7 20:46 hst
drwxrwxrwx 1 Adm1n admin 66 Aug 31 2025 immich
drwxrwx--- 1 Adm1n Media 30 Jun 15 2025 jellyfinht
drwxrwxrwx 1 Adm1n admin 20 Aug 31 2025 kavita
drwxrwxrwx 1 Adm1n admin 0 Oct 12 2025 libreoffice
drwxrwxrwx 1 Adm1n admin 12 Dec 13 21:12 linkwarden
drwxrwxrwx 1 Adm1n admin 274 Apr 9 19:39 location-logger
drwxrwxrwx 1 dnsmasq systemd-journal 432 Aug 27 2025 mariadb
drwxrwxrwx 1 Adm1n admin 122 Apr 26 19:03 meeting-detector
drwxrwxrwx 1 Adm1n admin 0 Aug 15 2025 mindfulmama
drwxrwxrwx 1 Adm1n admin 22 Jul 16 2025 n8n
drwxrwxrwx 1 Adm1n admin 176 Feb 20 17:33 notifier-app
drwxrwxrwx 1 Adm1n admin 52 Jun 15 2025 npm
drwxrwxrwx 1 Adm1n admin 306 Mar 29 17:34 oauth
drwxrwxrwx 1 Adm1n admin 92 Jun 15 2025 obsidian
drwxr-xr-x 1 root root 60 Mar 7 20:56 ollama
drwxr-xr-x 1 911 911 128 Jul 28 2025 openttd
drwxrwxrwx 1 Adm1n admin 234 Mar 7 16:30 openvpn-client
drwxr-xr-x 1 root root 58 May 2 23:15 open-webui
drwxrwxrwx 1 Adm1n admin 134 Dec 31 13:13 orchestrator
drwxrwxrwx 1 Adm1n admin 406 Mar 25 20:39 outfit-app
drwxrwxrwx 1 Adm1n admin 90 Aug 28 2025 owntracks-stack
drwxrwxrwx 1 Adm1n admin 156 Mar 10 20:51 paperlessngx
drwxrwxrwx 1 Adm1n admin 162 May 8 20:36 payments-logger
drwxrwxrwx 1 Adm1n admin 0 Sep 28 2025 personal-log
drwxrwxrwx 1 Adm1n admin 616 Mar 7 20:46 personal-log-system
drwxrwxrwx 1 Adm1n admin 26 Feb 19 19:41 player
drwxrwxrwx 1 Adm1n admin 202 Feb 23 21:35 portainer
drwxrwxrwx 1 dnsmasq admin 484 Dec 4 19:31 portnotedb
drwxrwxrwx 1 Adm1n admin 140 Apr 4 15:49 reminders-app
drwxrwxrwx 1 Adm1n admin 60 Oct 29 2025 romm
drwxrwxrwx 1 Adm1n admin 108 Feb 23 20:15 second-brain
drwxrwxrwx 1 Adm1n admin 10 Dec 30 17:16 static
drwxrwxrwx 1 Adm1n admin 28 Jun 19 2025 stirling
drwxrwxrwx 1 Adm1n admin 86 Oct 25 2025 syncthing
drwxrwxrwx 1 root root 56 Jun 5 2025 tailscale
drwxrwxrwx 1 Adm1n admin 186 Sep 23 2025 temp-logger
drwxrwxrwx 1 Adm1n admin 122 Jul 19 2025 test-app
drwxrwxrwx 1 Adm1n admin 52 Jun 14 2025 tmp
drwxrwxrwx 1 Adm1n admin 36 Jul 13 2025 torrent-stack
drwxrwxrwx 1 Adm1n admin 48 Dec 19 10:58 tree
drwxrwxrwx 1 Adm1n admin 0 Oct 31 2025 trilium
drwxrwxrwx 1 Adm1n admin 34 Dec 3 21:18 tubearchivist
drwxrwxrwx 1 Adm1n admin 22 Jul 25 2025 twenty
drwxrwxrwx 1 Adm1n admin 0 Nov 2 2025 uptimekuma
drwxrwxrwx 1 Adm1n admin 30 Dec 7 17:30 ytptube
Bash
List all files in payments-logger directory
IN
find /volume2/docker/payments-logger -type f | sort
Copy code to clipboard
OUT
/volume2/docker/payments-logger/API.md
/volume2/docker/payments-logger/backend/Dockerfile
/volume2/docker/payments-logger/backend/.dockerignore
/volume2/docker/payments-logger/backend/package.json
/volume2/docker/payments-logger/backend/prisma/migrations/20260210_init/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/20260210_simplify/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/20260222_add_card/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/20260508_add_users/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/migration_lock.toml
/volume2/docker/payments-logger/backend/prisma/schema.prisma
/volume2/docker/payments-logger/backend/src/auth.js
/volume2/docker/payments-logger/backend/src/index.js
/volume2/docker/payments-logger/backend/src/parser.js
/volume2/docker/payments-logger/backend/src/routes/payments.js
/volume2/docker/payments-logger/.claude/settings.local.json
/volume2/docker/payments-logger/docker-compose.yml
/volume2/docker/payments-logger/.env
/volume2/docker/payments-logger/.env.example
/volume2/docker/payments-logger/frontend/Dockerfile
/volume2/docker/payments-logger/frontend/.dockerignore
/volume2/docker/payments-logger/frontend/index.html
/volume2/docker/payments-logger/frontend/package.json
/volume2/docker/payments-logger/frontend/postcss.config.js
/volume2/docker/payments-logger/frontend/src/App.jsx
/volume2/docker/payments-logger/frontend/src/auth.js
/volume2/docker/payments-logger/frontend/src/components/AuthProvider.jsx
/volume2/docker/payments-logger/frontend/src/components/FilterBar.jsx
/volume2/docker/payments-logger/frontend/src/components/PaymentCard.jsx
/volume2/docker/payments-logger/frontend/src/components/PaymentList.jsx
/volume2/docker/payments-logger/frontend/src/components/PaymentTable.jsx
/volume2/docker/payments-logger/frontend/src/index.css
/volume2/docker/payments-logger/frontend/src/main.jsx
/volume2/docker/payments-logger/frontend/tailwind.config.js
/volume2/docker/payments-logger/frontend/vite.config.js
/volume2/docker/payments-logger/.gitignore
/volume2/docker/payments-logger/README.md
Bash
List all files in dsk-uploader directory
IN
find /volume2/docker/dsk-uploader -type f | sort
Copy code to clipboard
OUT
/volume2/docker/dsk-uploader/app_flask.py
/volume2/docker/dsk-uploader/app.py
/volume2/docker/dsk-uploader/docker-compose.yml
/volume2/docker/dsk-uploader/Dockerfile
/volume2/docker/dsk-uploader/.dockerignore
/volume2/docker/dsk-uploader/dskuploader.py
/volume2/docker/dsk-uploader/.env
/volume2/docker/dsk-uploader/.env.example
/volume2/docker/dsk-uploader/.git/COMMIT_EDITMSG
/volume2/docker/dsk-uploader/.git/config
/volume2/docker/dsk-uploader/.git/description
/volume2/docker/dsk-uploader/.git/FETCH_HEAD
/volume2/docker/dsk-uploader/.git/HEAD
/volume2/docker/dsk-uploader/.git/hooks/applypatch-msg.sample
/volume2/docker/dsk-uploader/.git/hooks/commit-msg.sample
/volume2/docker/dsk-uploader/.git/hooks/fsmonitor-watchman.sample
/volume2/docker/dsk-uploader/.git/hooks/post-update.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-applypatch.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-commit.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-merge-commit.sample
/volume2/docker/dsk-uploader/.git/hooks/prepare-commit-msg.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-push.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-rebase.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-receive.sample
/volume2/docker/dsk-uploader/.git/hooks/push-to-checkout.sample
/volume2/docker/dsk-uploader/.git/hooks/update.sample
/volume2/docker/dsk-uploader/.gitignore
/volume2/docker/dsk-uploader/.git/index
/volume2/docker/dsk-uploader/.git/info/exclude
/volume2/docker/dsk-uploader/.git/logs/HEAD
/volume2/docker/dsk-uploader/.git/logs/refs/heads/main
/volume2/docker/dsk-uploader/.git/logs/refs/remotes/origin/HEAD
/volume2/docker/dsk-uploader/.git/logs/refs/remotes/origin/main
/volume2/docker/dsk-uploader/.git/objects/0b/918bed65202bedaa9fa092e539d607be2eea65
/volume2/docker/dsk-uploader/.git/objects/11/b908125d2f0feebf7aca6d24e127f334bce611
/volume2/docker/dsk-uploader/.git/objects/56/a2766ae5422b18e5b1a418fd231ad12fef08e6
/volume2/docker/dsk-uploader/.git/objects/65/386fd3b4ac62094500e21c23845d05b9d18a4f
/volume2/docker/dsk-uploader/.git/objects/7b/2d7b18213f9516ec4544f309772ee4808146bb
/volume2/docker/dsk-uploader/.git/objects/7c/3f071fef98751a68b7d93779f76cf5d5aa8ebf
/volume2/docker/dsk-uploader/.git/objects/85/b5483672f68c327c39ea8c29e94ae8b22b7bbf
/volume2/docker/dsk-uploader/.git/objects/8e/a1cbf78eae8a86c5990d0582db1847c0226b56
/volume2/docker/dsk-uploader/.git/objects/ed/8e93af8cc77c7a85f87a9f37573c51b839e571
/volume2/docker/dsk-uploader/.git/objects/ee/3d5f92e57deec809abda371386e371f32de9bb
/volume2/docker/dsk-uploader/.git/objects/f3/98248da8f4911d463d9a33155fcf58a65092cc
/volume2/docker/dsk-uploader/.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.idx
/volume2/docker/dsk-uploader/.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.pack
/volume2/docker/dsk-uploader/.git/ORIG_HEAD
/volume2/docker/dsk-uploader/.git/packed-refs
/volume2/docker/dsk-uploader/.git/refs/heads/main
/volume2/docker/dsk-uploader/.git/refs/remotes/origin/HEAD
/volume2/docker/dsk-uploader/.git/refs/remotes/origin/main
/volume2/docker/dsk-uploader/notion_connector/client.py
/volume2/docker/dsk-uploader/notion_connector/exceptions/exceptions.py
/volume2/docker/dsk-uploader/notion_connector/exceptions/__init__.py
/volume2/docker/dsk-uploader/notion_connector/__init__.py
/volume2/docker/dsk-uploader/notion_connector/resources/blo...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G)","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.2601756,"width":0.0019946808,"height":0.008778931},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.024933511,"top":0.056664005,"width":0.01662234,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Explorer Section: finance [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: finance [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.039228722,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"FINANCE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.039228722,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.07980846,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":17,"bounds":{"left":0.024933511,"top":0.07980846,"width":0.036901597,"height":0.0103751}}],"role_description":"text"},{"role":"AXStaticText","text":"finance","depth":27,"bounds":{"left":0.01861702,"top":0.09577015,"width":0.01462766,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.01861702,"top":0.096568234,"width":0.0016622341,"height":0.011971269}},{"char_start":1,"char_count":6,"bounds":{"left":0.020279255,"top":0.096568234,"width":0.013297873,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"!","depth":27,"bounds":{"left":0.10837766,"top":0.096568234,"width":0.0016622341,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.0029920214,"height":0.0103751}},{"char_start":1,"char_count":6,"bounds":{"left":0.025598405,"top":0.95131683,"width":0.013630319,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.0026595744,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.025265958,"top":0.9688747,"width":0.015292553,"height":0.0103751}}],"role_description":"text"},{"role":"AXRadioButton","text":"docker-compose.yml, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.0625,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":".env, Editor Group 1","depth":28,"bounds":{"left":0.17785904,"top":0.047885075,"width":0.040226065,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.14527926,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","depth":28,"bounds":{"left":0.13763298,"top":0.6440543,"width":0.18018617,"height":0.014365523},"on_screen":true,"value":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","depth":29,"bounds":{"left":0.13763298,"top":0.6440543,"width":0.18018617,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Design new payment-logge…, Editor Group 2","depth":28,"bounds":{"left":0.41023937,"top":0.047885075,"width":0.07912234,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"finance-hub — Implementation Plan, Editor Group 3","depth":28,"bounds":{"left":0.70478725,"top":0.047885075,"width":0.09208777,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXButton","text":"alert Disconnected from SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.06549202,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Disconnected from SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.054853722,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.06715426,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.06881649,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.07413564,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0787899,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.084109046,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.09142287,"top":0.98244214,"width":0.012632979,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0930851,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.09840426,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sign In","depth":16,"bounds":{"left":0.9650931,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.96675533,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sign In","depth":17,"bounds":{"left":0.97207445,"top":0.9856345,"width":0.013962766,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Info: Setting up SSH Host nas: (details) Initializing VS Code Server","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Design new payment-logger and dsk-uploader hybrid app","depth":19,"bounds":{"left":0.41223404,"top":0.08060654,"width":0.099734046,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.6828458,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.69348407,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"payments.js","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"I'll explore all three reference projects in parallel to understand their structure before planning.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore payment-logger app structure and functionality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:\n1. Tech stack (frontend framework, backend framework, database)\n2. What the app does - its core purpose and features\n3. Database schema - all tables, relationships\n4. API routes - all endpoints, their purpose and request/response shapes\n5. How data flows (ingest, storage, retrieval)\n6. Any auth/middleware setup\n7. Docker/deployment setup\n8. Key files and their roles\n\nReport with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore dsk-uploader app structure and functionality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:\n1. Tech stack (frontend framework, backend framework, database)\n2. What the app does - its core purpose and features\n3. Database schema - all tables, relationships\n4. API routes - all endpoints, their purpose and request/response shapes\n5. How file uploads work - what files, what format, how parsed\n6. Any auth/middleware setup\n7. Docker/deployment setup\n8. Key files and their roles\n\nReport with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore auth folder and authentik integration","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:\n1. What auth system is being used (Authentik)\n2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?\n3. Middleware - how is auth enforced on routes?\n4. Any frontend auth flow - login redirect, token handling, protected routes\n5. Environment variables related to auth\n6. Docker/deployment setup for the auth service itself\n7. Any example of how other apps integrate with this auth\n\nReport with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"payments.js","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"continue","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Launching parallel exploration of all three reference projects.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore payment-logger app structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. Tech stack (frontend framework, backend framework, database, etc.)\n3. What the app does - its core functionality\n4. How data is ingested (look at /ingest route especially)\n5. Database schema (what tables/collections exist)\n6. API routes and their purposes\n7. Frontend pages and components\n8. Docker setup\n9. Any auth/session handling\n\nPlease read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/payments-logger -type f -name \"*.json\" -o -name \"*.js\" -o -name \"*.jsx\" -o -name \"*.ts\" -o -name \"*.tsx\" -o -name \"*.py\" -o -name \"*.sql\" -o -name \"Dockerfile*\" -o -name \"docker-compose*\" -o -name \".env*\" 2>/dev/null | head -50","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/payments-logger/.env\n/volume2/docker/finance/payments-logger/.env.example\n/volume2/docker/finance/payments-logger/docker-compose.yml\n/volume2/docker/finance/payments-logger/.claude/settings.local.json\n/volume2/docker/finance/payments-logger/backend/Dockerfile\n/volume2/docker/finance/payments-logger/backend/package.json\n/volume2/docker/finance/payments-logger/frontend/Dockerfile\n/volume2/docker/finance/payments-logger/frontend/package.json\n/volume2/docker/finance/payments-logger/frontend/postcss.config.js\n/volume2/docker/finance/payments-logger/frontend/tailwind.config.js\n/volume2/docker/finance/payments-logger/frontend/vite.config.js\n/volume2/docker/finance/payments-logger/auth/.env\n/volume2/docker/finance/payments-logger/auth/.env.example\n/volume2/docker/finance/payments-logger/backend/src/auth.js\n/volume2/docker/finance/payments-logger/backend/src/index.js\n/volume2/docker/finance/payments-logger/backend/src/parser.js\n/volume2/docker/finance/payments-logger/frontend/src/App.jsx\n/volume2/docker/finance/payments-logger/frontend/src/auth.js\n/volume2/docker/finance/payments-logger/frontend/src/main.jsx\n/volume2/docker/finance/payments-logger/backend/src/routes/payments.js\n/volume2/docker/finance/payments-logger/frontend/src/components/AuthProvider.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/PaymentCard.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/PaymentList.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx\n/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260210_init/migration.sql\n/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260210_simplify/migration.sql\n/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260222_add_card/migration.sql\n/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260508_add_users/migration.sql","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore dsk-uploader app structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. Tech stack (frontend framework, backend framework, database, etc.)\n3. What the app does - its core functionality\n4. How file uploads work (what format, what processing happens)\n5. Database schema (what tables/collections exist)\n6. API routes and their purposes\n7. Frontend pages and components\n8. Docker setup\n9. Any auth/session handling\n\nPlease read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/dsk-uploader -type f -name \"*.json\" -o -type f -name \"*.yml\" -o -type f -name \"*.yaml\" | head -30","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/dsk-uploader/docker-compose.yml","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"cd /volume2/docker/finance/payments-logger && find . -type f \\( -name \"*.json\" -o -name \"*.js\" -o -name \"*.jsx\" -o -name \"*.ts\" -o -name \"*.tsx\" -o -name \"*.sql\" -o -name \"*.yml\" -o -name \"*.yaml\" -o -name \"Dockerfile*\" -o -name \".env*\" \\) | grep -v node_modules | sort","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"./auth/.env\n./auth/.env.example\n./backend/Dockerfile\n./backend/package.json\n./backend/prisma/migrations/20260210_init/migration.sql\n./backend/prisma/migrations/20260210_simplify/migration.sql\n./backend/prisma/migrations/20260222_add_card/migration.sql\n./backend/prisma/migrations/20260508_add_users/migration.sql\n./backend/src/auth.js\n./backend/src/index.js\n./backend/src/parser.js\n./backend/src/routes/payments.js\n./.claude/settings.local.json\n./docker-compose.yml\n./.env\n./.env.example\n./frontend/Dockerfile\n./frontend/package.json\n./frontend/postcss.config.js\n./frontend/src/App.jsx\n./frontend/src/auth.js\n./frontend/src/components/AuthProvider.jsx\n./frontend/src/components/FilterBar.jsx\n./frontend/src/components/PaymentCard.jsx\n./frontend/src/components/PaymentList.jsx\n./frontend/src/components/PaymentTable.jsx\n./frontend/src/main.jsx\n./frontend/tailwind.config.js\n./frontend/vite.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore auth project structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. What authentication system is used (authentik integration details)\n3. How OAuth/OIDC flow works\n4. Any middleware or helper functions for protecting routes\n5. Session management approach\n6. How frontend handles auth state\n7. Any example of how other apps integrate with this auth system\n8. Docker setup and environment variables\n\nPlease read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"cd /volume2/docker/finance/dsk-uploader && find . -type f | head -100","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"./.gitignore\n./README.md\n./USAGE.md\n./app.py\n./app_flask.py\n./dskuploader.py\n./requirements.txt\n./.env\n./.env.example\n./Dockerfile\n./docker-compose.yml\n./.dockerignore\n./.git/description\n./.git/packed-refs\n./.git/HEAD\n./.git/FETCH_HEAD\n./.git/index\n./.git/COMMIT_EDITMSG\n./.git/ORIG_HEAD\n./notion_connector/__init__.py\n./notion_connector/client.py\n./templates/base.html\n./templates/index.html\n./templates/result.html\n./notion_connector/resources/__init__.py\n./notion_connector/resources/block.py\n./notion_connector/resources/block_property.py\n./notion_connector/resources/database.py\n./notion_connector/resources/database_property.py\n./notion_connector/resources/filter_builder.py\n./notion_connector/resources/page.py\n./notion_connector/resources/page_property.py\n./notion_connector/resources/search.py\n./.git/info/exclude\n./.git/hooks/post-update.sample\n./.git/hooks/pre-applypatch.sample\n./.git/hooks/pre-commit.sample\n./.git/hooks/applypatch-msg.sample\n./.git/hooks/pre-rebase.sample\n./.git/hooks/pre-merge-commit.sample\n./.git/hooks/update.sample\n./.git/hooks/pre-push.sample\n./.git/hooks/push-to-checkout.sample\n./.git/hooks/prepare-commit-msg.sample\n./.git/hooks/commit-msg.sample\n./.git/hooks/pre-receive.sample\n./.git/hooks/fsmonitor-watchman.sample\n./.git/logs/HEAD\n./notion_connector/exceptions/__init__.py\n./notion_connector/exceptions/exceptions.py\n./.git/config\n./.git/refs/heads/main\n./.git/refs/remotes/origin/HEAD\n./.git/refs/remotes/origin/main\n./.git/objects/7c/3f071fef98751a68b7d93779f76cf5d5aa8ebf\n./.git/objects/ed/8e93af8cc77c7a85f87a9f37573c51b839e571\n./.git/objects/7b/2d7b18213f9516ec4544f309772ee4808146bb\n./.git/objects/65/386fd3b4ac62094500e21c23845d05b9d18a4f\n./.git/objects/ee/3d5f92e57deec809abda371386e371f32de9bb\n./.git/logs/refs/heads/main\n./.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.pack\n./.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.idx\n./.git/objects/85/b5483672f68c327c39ea8c29e94ae8b22b7bbf\n./.git/objects/f3/98248da8f4911d463d9a33155fcf58a65092cc\n./.git/objects/0b/918bed65202bedaa9fa092e539d607be2eea65\n./.git/objects/8e/a1cbf78eae8a86c5990d0582db1847c0226b56\n./.git/objects/11/b908125d2f0feebf7aca6d24e127f334bce611\n./.git/objects/56/a2766ae5422b18e5b1a418fd231ad12fef08e6\n./.git/logs/refs/remotes/origin/HEAD\n./.git/logs/refs/remotes/origin/main","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/auth -type f -name \"*.py\" -o -name \"*.js\" -o -name \"*.ts\" -o -name \"*.tsx\" -o -name \"*.json\" -o -name \"*.yaml\" -o -name \"*.yml\" -o -name \"*.env*\" -o -name \"Dockerfile*\" | head -100","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/auth/.env\n/volume2/docker/finance/auth/.env.example\n/volume2/docker/finance/auth/docker-compose.yml\n/volume2/docker/finance/auth/auth/.env\n/volume2/docker/finance/auth/auth/.env.example\n/volume2/docker/finance/auth/auth/docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"dsk-uploader","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"dsk-uploader","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ls -la /volume2/docker/finance/auth/ && echo \"---\" && find /volume2/docker/finance/auth -type d | sort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"total 20\ndrwxrwxrwx 1 Adm1n admin 108 May 8 21:08 .\ndrwxrwxrwx 1 Adm1n admin 62 May 8 21:10 ..\ndrwxrwxrwx 1 Adm1n admin 128 May 8 21:08 auth\ndrwxrwxrwx 1 Adm1n admin 0 May 8 21:06 certs\ndrwxrwxrwx 1 Adm1n admin 0 May 8 21:06 db\n-rwxrwxrwx 1 Adm1n admin 3328 May 8 21:07 docker-compose.yml\n-rwxrwxrwx 1 Adm1n admin 949 May 8 21:06 .env\n-rwxrwxrwx 1 Adm1n admin 2258 May 8 21:06 .env.example\n-rwxrwxrwx 1 Adm1n admin 5501 May 8 21:07 README.md\n---\n/volume2/docker/finance/auth\n/volume2/docker/finance/auth/auth\n/volume2/docker/finance/auth/auth/certs\n/volume2/docker/finance/auth/auth/db\n/volume2/docker/finance/auth/auth/db/base\n/volume2/docker/finance/auth/auth/db/base/1\n/volume2/docker/finance/auth/auth/db/base/16384\n/volume2/docker/finance/auth/auth/db/base/4\n/volume2/docker/finance/auth/auth/db/base/5\n/volume2/docker/finance/auth/auth/db/global\n/volume2/docker/finance/auth/auth/db/pg_commit_ts\n/volume2/docker/finance/auth/auth/db/pg_dynshmem\n/volume2/docker/finance/auth/auth/db/pg_logical\n/volume2/docker/finance/auth/auth/db/pg_logical/mappings\n/volume2/docker/finance/auth/auth/db/pg_logical/snapshots\n/volume2/docker/finance/auth/auth/db/pg_multixact\n/volume2/docker/finance/auth/auth/db/pg_multixact/members\n/volume2/docker/finance/auth/auth/db/pg_multixact/offsets\n/volume2/docker/finance/auth/auth/db/pg_notify\n/volume2/docker/finance/auth/auth/db/pg_replslot\n/volume2/docker/finance/auth/auth/db/pg_serial\n/volume2/docker/finance/auth/auth/db/pg_snapshots\n/volume2/docker/finance/auth/auth/db/pg_stat\n/volume2/docker/finance/auth/auth/db/pg_stat_tmp\n/volume2/docker/finance/auth/auth/db/pg_subtrans\n/volume2/docker/finance/auth/auth/db/pg_tblspc\n/volume2/docker/finance/auth/auth/db/pg_twophase\n/volume2/docker/finance/auth/auth/db/pg_wal\n/volume2/docker/finance/auth/auth/db/pg_wal/archive_status\n/volume2/docker/finance/auth/auth/db/pg_xact\n/volume2/docker/finance/auth/auth/media\n/volume2/docker/finance/auth/auth/templates\n/volume2/docker/finance/auth/certs\n/volume2/docker/finance/auth/db","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"README.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"requirements.txt","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"requirements.txt","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"payments.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"auth.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"auth.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"README.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"parser.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/auth/auth -type f | grep -v \"^/volume2/docker/finance/auth/auth/db\" | grep -v \"^/volume2/docker/finance/auth/auth/certs\" | grep -v \"^/volume2/docker/finance/auth/auth/media\" | sort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/auth/auth/docker-compose.yml\n/volume2/docker/finance/auth/auth/.env\n/volume2/docker/finance/auth/auth/.env.example\n/volume2/docker/finance/auth/auth/README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"migration.sql","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"migration.sql","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"migration.sql","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"migration.sql","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"README.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"App.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"App.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"main.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"auth.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"auth.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance -name \"*.py\" -o -name \"*.js\" -o -name \"*.ts\" -o -name \"*.tsx\" 2>/dev/null | head -50","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/dsk-uploader/app.py\n/volume2/docker/finance/dsk-uploader/app_flask.py\n/volume2/docker/finance/dsk-uploader/dskuploader.py\n/volume2/docker/finance/payments-logger/frontend/postcss.config.js\n/volume2/docker/finance/payments-logger/frontend/tailwind.config.js\n/volume2/docker/finance/payments-logger/frontend/vite.config.js\n/volume2/docker/finance/dsk-uploader/notion_connector/__init__.py\n/volume2/docker/finance/dsk-uploader/notion_connector/client.py\n/volume2/docker/finance/payments-logger/backend/src/auth.js\n/volume2/docker/finance/payments-logger/backend/src/index.js\n/volume2/docker/finance/payments-logger/backend/src/parser.js\n/volume2/docker/finance/payments-logger/frontend/src/auth.js\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/__init__.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/block.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/block_property.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/database.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/database_property.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/filter_builder.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/page.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/page_property.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/search.py\n/volume2/docker/finance/payments-logger/backend/src/routes/payments.js\n/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/__init__.py\n/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/exceptions.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"AuthProvider.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AuthProvider.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentTable.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentTable.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"FilterBar.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"FilterBar.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"auth.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"auth.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"auth.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"auth.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"migration.sql","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"migration.sql","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/payments-logger -name \"docker-compose.yml\" -o -name \".env*\" -o -name \"package.json\" | head -20","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/payments-logger/.env\n/volume2/docker/finance/payments-logger/.env.example\n/volume2/docker/finance/payments-logger/docker-compose.yml\n/volume2/docker/finance/payments-logger/backend/package.json\n/volume2/docker/finance/payments-logger/frontend/package.json\n/volume2/docker/finance/payments-logger/auth/.env\n/volume2/docker/finance/payments-logger/auth/.env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/payments-logger -name \"schema.prisma\" -type f","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"schema.prisma","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"schema.prisma","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ls -la /volume2/docker/finance/payments-logger/auth/ && echo \"---\" && find /volume2/docker/finance/payments-logger -name \"Dockerfile*\" | head -10","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"total 16\ndrwxrwxrwx 1 Adm1n admin 64 May 8 21:07 .\ndrwxrwxrwx 1 Adm1n admin 170 May 8 21:07 ..\ndrwxrwxrwx 1 Adm1n admin 0 May 8 21:07 certs\ndrwxrwxrwx 1 Adm1n admin 0 May 8 21:07 db\n-rwxrwxrwx 1 Adm1n admin 949 May 8 21:07 .env\n-rwxrwxrwx 1 Adm1n admin 2258 May 8 21:07 .env.example\n-rwxrwxrwx 1 Adm1n admin 5501 May 8 21:07 README.md\n---\n/volume2/docker/finance/payments-logger/backend/Dockerfile\n/volume2/docker/finance/payments-logger/frontend/Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"cd /volume2/docker/finance/payments-logger && tree -L 3 -I 'node_modules|.next|dist|build' --charset ascii 2>/dev/null || find . -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -type f | head -60","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".\n|-- API.md\n|-- auth\n| |-- certs\n| |-- db\n| `-- README.md\n|-- backend\n| |-- Dockerfile\n| |-- package.json\n| |-- prisma\n| | |-- migrations\n| | `-- schema.prisma\n| `-- src\n| |-- auth.js\n| |-- index.js\n| |-- parser.js\n| `-- routes\n|-- docker-compose.yml\n|-- frontend\n| |-- Dockerfile\n| |-- index.html\n| |-- package.json\n| |-- postcss.config.js\n| |-- src\n| | |-- App.jsx\n| | |-- auth.js\n| | |-- components\n| | |-- index.css\n| | `-- main.jsx\n| |-- tailwind.config.js\n| `-- vite.config.js\n`-- README.md\n\n12 directories, 20 files","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"head -100 /volume2/docker/finance/payments-logger/backend/package.json && echo \"---FRONTEND---\" && head -100 /volume2/docker/finance/payments-logger/frontend/package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"{\n \"name\": \"payments-logger-backend\",\n \"version\": \"1.0.0\",\n \"description\": \"Payment SMS logger backend\",\n \"main\": \"src/index.js\",\n \"scripts\": {\n \"start\": \"node src/index.js\",\n \"dev\": \"nodemon src/index.js\",\n \"prisma:generate\": \"prisma generate\",\n \"prisma:migrate\": \"prisma migrate deploy\",\n \"prisma:migrate:dev\": \"prisma migrate dev\"\n },\n \"dependencies\": {\n \"@prisma/client\": \"^5.22.0\",\n \"bcryptjs\": \"^2.4.3\",\n \"cors\": \"^2.8.5\",\n \"express\": \"^4.21.1\",\n \"express-rate-limit\": \"^7.4.0\",\n \"jose\": \"^5.9.6\",\n \"morgan\": \"^1.10.0\"\n },\n \"devDependencies\": {\n \"nodemon\": \"^3.1.7\",\n \"prisma\": \"^5.22.0\"\n }\n}\n---FRONTEND---\n{\n \"name\": \"payments-logger-frontend\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"lucide-react\": \"^0.460.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.3.12\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"autoprefixer\": \"^10.4.20\",\n \"postcss\": \"^8.4.49\",\n \"tailwindcss\": \"^3.4.15\",\n \"vite\": \"^6.0.1\"\n }\n}","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"payments.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance -name \"*.md\" -type f | xargs grep -l \"auth\\|Authentik\\|OAuth\\|OIDC\" 2>/dev/null | head -5","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/payments-logger/API.md\n/volume2/docker/finance/auth/README.md\n/volume2/docker/finance/auth/auth/README.md\n/volume2/docker/finance/payments-logger/auth/README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"API.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"API.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"head -50 /volume2/docker/finance/payments-logger/frontend/src/main.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport { AuthProvider } from './components/AuthProvider';\nimport './index.css';\n\nReactDOM.createRoot(document.getElementById('root')).render(\n <React.StrictMode>\n <AuthProvider>\n <App />\n </AuthProvider>\n </React.StrictMode>\n);","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/payments-logger/frontend/src -name \"*.jsx\" -o -name \"*.js\" | head -20","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/payments-logger/frontend/src/App.jsx\n/volume2/docker/finance/payments-logger/frontend/src/auth.js\n/volume2/docker/finance/payments-logger/frontend/src/main.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/AuthProvider.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/PaymentCard.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/PaymentList.jsx\n/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"AuthProvider.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AuthProvider.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"AuthProvider.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AuthProvider.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"head -50 /volume2/docker/finance/payments-logger/frontend/src/App.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"import React, { useState, useEffect, useCallback } from 'react';\nimport { CreditCard, RefreshCw, LogOut } from 'lucide-react';\nimport FilterBar from './components/FilterBar';\nimport PaymentTable from './components/PaymentTable';\nimport { useAuth } from './components/AuthProvider';\n\nconst API_BASE = '/api/payments';\n\nexport default function App() {\n const { logout, getToken } = useAuth();\n const [payments, setPayments] = useState([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [filters, setFilters] = useState({});\n const [sortBy, setSortBy] = useState('createdAt');\n const [sortDir, setSortDir] = useState('desc');\n const [filterOptions, setFilterOptions] = useState({ types: [], recipients: [], tags: [] });\n const [loading, setLoading] = useState(false);\n\n const authFetch = useCallback(async (url, options = {}) => {\n const token = await getToken();\n const headers = { ...(options.headers || {}) };\n if (token) headers['Authorization'] = `Bearer ${token}`;\n return fetch(url, { ...options, headers });\n }, [getToken]);\n\n const fetchPayments = useCallback(async () => {\n setLoading(true);\n try {\n const params = new URLSearchParams();\n params.set('page', page);\n params.set('limit', 50);\n params.set('sortBy', sortBy);\n params.set('sortDir', sortDir);\n Object.entries(filters).forEach(([key, val]) => {\n if (val) params.set(key, val);\n });\n const res = await authFetch(`${API_BASE}?${params}`);\n const data = await res.json();\n setPayments(data.payments || []);\n setTotal(data.total || 0);\n } catch (err) {\n console.error('Failed to fetch payments:', err);\n } finally {\n setLoading(false);\n }\n }, [page, filters, sortBy, sortDir, authFetch]);\n\n const fetchFilterOptions = useCallback(async () => {\n try {","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"app.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"app_flask.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app_flask.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"dskuploader.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"dskuploader.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"client.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"client.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"database.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"database.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"base.html","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"base.html","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"result.html","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"result.html","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"page_property.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"page_property.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"USAGE.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"USAGE.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance/dsk-uploader -type f \\( -name \"*.py\" -o -name \"*.json\" \\) | grep -E \"(exceptions|page\\.py)\" | head -10","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/__init__.py\n/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/exceptions.py\n/volume2/docker/finance/dsk-uploader/notion_connector/resources/page.py","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"page.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"page.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"exceptions.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"exceptions.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"tree -L 3 /volume2/docker/finance/dsk-uploader 2>/dev/null | head -80 || find /volume2/docker/finance/dsk-uploader -type d -not -path '.*/.git/*' | sort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/dsk-uploader\n├── app_flask.py\n├── app.py\n├── docker-compose.yml\n├── Dockerfile\n├── dskuploader.py\n├── notion_connector\n│ ├── client.py\n│ ├── exceptions\n│ │ ├── exceptions.py\n│ │ └── __init__.py\n│ ├── __init__.py\n│ └── resources\n│ ├── block_property.py\n│ ├── block.py\n│ ├── database_property.py\n│ ├── database.py\n│ ├── filter_builder.py\n│ ├── __init__.py\n│ ├── page_property.py\n│ ├── page.py\n│ └── search.py\n├── README.md\n├── requirements.txt\n├── templates\n│ ├── base.html\n│ ├── index.html\n│ └── result.html\n└── USAGE.md\n\n5 directories, 24 files","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"README.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"API.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"API.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now I have a complete picture of all three. Let me design the plan.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Design combined app architecture","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:\n\n---\n\n## App 1: payments-logger (Node.js)\n- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI\n- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS\n- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage\n- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)\n- **Schema** (PostgreSQL via Prisma):\n - `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at\n - `tags` table: id, name, color — M2M with payments via `_PaymentToTag`\n - `users` table: id, username, hashed_password (this will be REMOVED)\n- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system\n- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance\n\n## App 2: dsk-uploader (Python/Flask)\n- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database\n- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5\n- **Auth**: None (open)\n- **CSV format** (DSK Bank Bulgarian format, columns):\n - `Дата` (date, DD.MM.YYYY)\n - `Вид на трансакцията` (transaction type, Bulgarian)\n - `Основание` (reason/description — contains card number regex: `^\\d{6}x{6}\\d{4}$`)\n - `Дебит BGN` (debit amount, may be empty)\n - `Кредит BGN` (credit amount, may be empty)\n - `Наредител/Получател` (orderer/recipient name)\n - `Номер сметка на наредителя / получателя` (account number)\n- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers\n- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)\n\n## App 3: auth (Authentik)\n- **Mode**: Proxy mode via NPM (forward auth)\n- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:\n - `X-authentik-username` \n - `X-authentik-email`\n - `X-authentik-groups`\n- **No code integration needed** in the app itself — just trust these headers from NPM\n- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`\n\n---\n\n## What the New Combined App Must Do\n\n1. **Single PostgreSQL database** for all transactions\n2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST\n3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema\n4. **Unified UI** — show all payments in one table regardless of source\n5. **Source indicator** in UI — badge showing \"INGEST\", \"UPLOAD\", or \"BOTH\" (if duplicate detection added)\n6. **Source filter** in FilterBar — filter by All/Ingest/Upload\n7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM\n8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination\n9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL\n\n---\n\n## Technical Constraints\n\n- Keep Node.js backend (not Python) — extend payments-logger's stack\n- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)\n- File upload: use `multer` npm middleware\n- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)\n- Add `source` enum field (INGEST/UPLOAD) to payments schema\n- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is\n- Remove `users` table from schema\n\n---\n\n## Please Design\n\n1. Complete folder structure for the new app (suggest name: \"finance-hub\" or similar — note this is a placeholder, user will confirm)\n2. Prisma schema with new fields (`source`, `currency`)\n3. All backend API routes\n4. CSV parser design in Node.js (port of the Python logic)\n5. Authentik auth middleware\n6. Frontend component structure (React) — what's reused from payments-logger, what's new\n7. Docker Compose setup\n8. Environment variables needed\n9. Step-by-step implementation order\n10. Verification checklist\n\nBe specific about file paths and code structure. This will be used to write actual implementation code.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"List all files in finance directory","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/finance -type f | sort | head -100","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/finance/auth/auth/db/base/1/112\n/volume2/docker/finance/auth/auth/db/base/1/113\n/volume2/docker/finance/auth/auth/db/base/1/1247\n/volume2/docker/finance/auth/auth/db/base/1/1247_fsm\n/volume2/docker/finance/auth/auth/db/base/1/1247_vm\n/volume2/docker/finance/auth/auth/db/base/1/1249\n/volume2/docker/finance/auth/auth/db/base/1/1249_fsm\n/volume2/docker/finance/auth/auth/db/base/1/1249_vm\n/volume2/docker/finance/auth/auth/db/base/1/1255\n/volume2/docker/finance/auth/auth/db/base/1/1255_fsm\n/volume2/docker/finance/auth/auth/db/base/1/1255_vm\n/volume2/docker/finance/auth/auth/db/base/1/1259\n/volume2/docker/finance/auth/auth/db/base/1/1259_fsm\n/volume2/docker/finance/auth/auth/db/base/1/1259_vm\n/volume2/docker/finance/auth/auth/db/base/1/13457\n/volume2/docker/finance/auth/auth/db/base/1/13457_fsm\n/volume2/docker/finance/auth/auth/db/base/1/13457_vm\n/volume2/docker/finance/auth/auth/db/base/1/13460\n/volume2/docker/finance/auth/auth/db/base/1/13461\n/volume2/docker/finance/auth/auth/db/base/1/13462\n/volume2/docker/finance/auth/auth/db/base/1/13462_fsm\n/volume2/docker/finance/auth/auth/db/base/1/13462_vm\n/volume2/docker/finance/auth/auth/db/base/1/13465\n/volume2/docker/finance/auth/auth/db/base/1/13466\n/volume2/docker/finance/auth/auth/db/base/1/13467\n/volume2/docker/finance/auth/auth/db/base/1/13467_fsm\n/volume2/docker/finance/auth/auth/db/base/1/13467_vm\n/volume2/docker/finance/auth/auth/db/base/1/13470\n/volume2/docker/finance/auth/auth/db/base/1/13471\n/volume2/docker/finance/auth/auth/db/base/1/13472\n/volume2/docker/finance/auth/auth/db/base/1/13472_fsm\n/volume2/docker/finance/auth/auth/db/base/1/13472_vm\n/volume2/docker/finance/auth/auth/db/base/1/13475\n/volume2/docker/finance/auth/auth/db/base/1/13476\n/volume2/docker/finance/auth/auth/db/base/1/1417\n/volume2/docker/finance/auth/auth/db/base/1/1418\n/volume2/docker/finance/auth/auth/db/base/1/174\n/volume2/docker/finance/auth/auth/db/base/1/175\n/volume2/docker/finance/auth/auth/db/base/1/2187\n/volume2/docker/finance/auth/auth/db/base/1/2224\n/volume2/docker/finance/auth/auth/db/base/1/2228\n/volume2/docker/finance/auth/auth/db/base/1/2328\n/volume2/docker/finance/auth/auth/db/base/1/2336\n/volume2/docker/finance/auth/auth/db/base/1/2337\n/volume2/docker/finance/auth/auth/db/base/1/2579\n/volume2/docker/finance/auth/auth/db/base/1/2600\n/volume2/docker/finance/auth/auth/db/base/1/2600_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2600_vm\n/volume2/docker/finance/auth/auth/db/base/1/2601\n/volume2/docker/finance/auth/auth/db/base/1/2601_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2601_vm\n/volume2/docker/finance/auth/auth/db/base/1/2602\n/volume2/docker/finance/auth/auth/db/base/1/2602_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2602_vm\n/volume2/docker/finance/auth/auth/db/base/1/2603\n/volume2/docker/finance/auth/auth/db/base/1/2603_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2603_vm\n/volume2/docker/finance/auth/auth/db/base/1/2604\n/volume2/docker/finance/auth/auth/db/base/1/2605\n/volume2/docker/finance/auth/auth/db/base/1/2605_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2605_vm\n/volume2/docker/finance/auth/auth/db/base/1/2606\n/volume2/docker/finance/auth/auth/db/base/1/2606_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2606_vm\n/volume2/docker/finance/auth/auth/db/base/1/2607\n/volume2/docker/finance/auth/auth/db/base/1/2607_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2607_vm\n/volume2/docker/finance/auth/auth/db/base/1/2608\n/volume2/docker/finance/auth/auth/db/base/1/2608_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2608_vm\n/volume2/docker/finance/auth/auth/db/base/1/2609\n/volume2/docker/finance/auth/auth/db/base/1/2609_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2609_vm\n/volume2/docker/finance/auth/auth/db/base/1/2610\n/volume2/docker/finance/auth/auth/db/base/1/2610_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2610_vm\n/volume2/docker/finance/auth/auth/db/base/1/2611\n/volume2/docker/finance/auth/auth/db/base/1/2612\n/volume2/docker/finance/auth/auth/db/base/1/2612_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2612_vm\n/volume2/docker/finance/auth/auth/db/base/1/2613\n/volume2/docker/finance/auth/auth/db/base/1/2615\n/volume2/docker/finance/auth/auth/db/base/1/2615_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2615_vm\n/volume2/docker/finance/auth/auth/db/base/1/2616\n/volume2/docker/finance/auth/auth/db/base/1/2616_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2616_vm\n/volume2/docker/finance/auth/auth/db/base/1/2617\n/volume2/docker/finance/auth/auth/db/base/1/2617_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2617_vm\n/volume2/docker/finance/auth/auth/db/base/1/2618\n/volume2/docker/finance/auth/auth/db/base/1/2618_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2618_vm\n/volume2/docker/finance/auth/auth/db/base/1/2619\n/volume2/docker/finance/auth/auth/db/base/1/2619_fsm\n/volume2/docker/finance/auth/auth/db/base/1/2619_vm\n/volume2/docker/finance/auth/auth/db/base/1/2620\n/volume2/docker/finance/auth/auth/db/base/1/2650\n/volume2/docker/finance/auth/auth/db/base/1/2651\n/volume2/docker/finance/auth/auth/db/base/1/2652","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"List docker directory contents","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ls -la /volume2/docker/","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"total 40\ndrwxrwxrwx 1 root root 1160 May 8 21:05 .\ndrwxr-xr-x 1 root root 246 Apr 6 19:54 ..\ndrwxrwxrwx 1 Adm1n admin 20 Jul 28 2025 adguard\ndrwxrwxrwx 1 Adm1n admin 66 Apr 5 13:14 ai-stack\ndrwxrwxrwx 1 Adm1n admin 12 Aug 1 2025 app-db\ndrwxrwxr-x 1 appflowy users 138 Dec 14 18:21 appflowy\ndrwxrwxrwx 1 Adm1n admin 72 May 6 14:55 audiobookshelf\ndrwxrwxrwx 1 Adm1n admin 128 Mar 30 19:52 auth\ndrwxrwxrwx 1 Adm1n admin 102 May 8 21:02 beszel\ndrwxrwxrwx 1 Adm1n admin 38 Jun 16 2025 bitwarden\ndrwxrwxrwx 1 Adm1n admin 36 Aug 25 2025 dawarich\ndrwxrwxrwx 1 Adm1n admin 322 Aug 15 2025 dsk-uploader\n-rwxrwxrwx 1 Adm1n admin 10244 Oct 29 2025 .DS_Store\ndrwxrwxrwx 1 Adm1n admin 62 May 8 21:10 finance\ndrwxrwxrwx 1 Adm1n admin 92 Aug 19 2025 flask-app\ndrwxrwxrwx 1 Adm1n admin 308 Oct 7 2025 garmin-connector\ndrwxrwxrwx 1 Adm1n admin 12 Jul 18 2025 gitea\ndrwxrwxrwx 1 Adm1n admin 0 Feb 16 19:30 health\ndrwxrwxrwx 1 Adm1n admin 220 Feb 16 21:09 health-tracker\ndrwxrwxrwx 1 Adm1n admin 0 Oct 31 2025 homarr\ndrwxrwxrwx 1 Adm1n admin 146 Mar 7 20:46 hst\ndrwxrwxrwx 1 Adm1n admin 66 Aug 31 2025 immich\ndrwxrwx--- 1 Adm1n Media 30 Jun 15 2025 jellyfinht\ndrwxrwxrwx 1 Adm1n admin 20 Aug 31 2025 kavita\ndrwxrwxrwx 1 Adm1n admin 0 Oct 12 2025 libreoffice\ndrwxrwxrwx 1 Adm1n admin 12 Dec 13 21:12 linkwarden\ndrwxrwxrwx 1 Adm1n admin 274 Apr 9 19:39 location-logger\ndrwxrwxrwx 1 dnsmasq systemd-journal 432 Aug 27 2025 mariadb\ndrwxrwxrwx 1 Adm1n admin 122 Apr 26 19:03 meeting-detector\ndrwxrwxrwx 1 Adm1n admin 0 Aug 15 2025 mindfulmama\ndrwxrwxrwx 1 Adm1n admin 22 Jul 16 2025 n8n\ndrwxrwxrwx 1 Adm1n admin 176 Feb 20 17:33 notifier-app\ndrwxrwxrwx 1 Adm1n admin 52 Jun 15 2025 npm\ndrwxrwxrwx 1 Adm1n admin 306 Mar 29 17:34 oauth\ndrwxrwxrwx 1 Adm1n admin 92 Jun 15 2025 obsidian\ndrwxr-xr-x 1 root root 60 Mar 7 20:56 ollama\ndrwxr-xr-x 1 911 911 128 Jul 28 2025 openttd\ndrwxrwxrwx 1 Adm1n admin 234 Mar 7 16:30 openvpn-client\ndrwxr-xr-x 1 root root 58 May 2 23:15 open-webui\ndrwxrwxrwx 1 Adm1n admin 134 Dec 31 13:13 orchestrator\ndrwxrwxrwx 1 Adm1n admin 406 Mar 25 20:39 outfit-app\ndrwxrwxrwx 1 Adm1n admin 90 Aug 28 2025 owntracks-stack\ndrwxrwxrwx 1 Adm1n admin 156 Mar 10 20:51 paperlessngx\ndrwxrwxrwx 1 Adm1n admin 162 May 8 20:36 payments-logger\ndrwxrwxrwx 1 Adm1n admin 0 Sep 28 2025 personal-log\ndrwxrwxrwx 1 Adm1n admin 616 Mar 7 20:46 personal-log-system\ndrwxrwxrwx 1 Adm1n admin 26 Feb 19 19:41 player\ndrwxrwxrwx 1 Adm1n admin 202 Feb 23 21:35 portainer\ndrwxrwxrwx 1 dnsmasq admin 484 Dec 4 19:31 portnotedb\ndrwxrwxrwx 1 Adm1n admin 140 Apr 4 15:49 reminders-app\ndrwxrwxrwx 1 Adm1n admin 60 Oct 29 2025 romm\ndrwxrwxrwx 1 Adm1n admin 108 Feb 23 20:15 second-brain\ndrwxrwxrwx 1 Adm1n admin 10 Dec 30 17:16 static\ndrwxrwxrwx 1 Adm1n admin 28 Jun 19 2025 stirling\ndrwxrwxrwx 1 Adm1n admin 86 Oct 25 2025 syncthing\ndrwxrwxrwx 1 root root 56 Jun 5 2025 tailscale\ndrwxrwxrwx 1 Adm1n admin 186 Sep 23 2025 temp-logger\ndrwxrwxrwx 1 Adm1n admin 122 Jul 19 2025 test-app\ndrwxrwxrwx 1 Adm1n admin 52 Jun 14 2025 tmp\ndrwxrwxrwx 1 Adm1n admin 36 Jul 13 2025 torrent-stack\ndrwxrwxrwx 1 Adm1n admin 48 Dec 19 10:58 tree\ndrwxrwxrwx 1 Adm1n admin 0 Oct 31 2025 trilium\ndrwxrwxrwx 1 Adm1n admin 34 Dec 3 21:18 tubearchivist\ndrwxrwxrwx 1 Adm1n admin 22 Jul 25 2025 twenty\ndrwxrwxrwx 1 Adm1n admin 0 Nov 2 2025 uptimekuma\ndrwxrwxrwx 1 Adm1n admin 30 Dec 7 17:30 ytptube","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"List all files in payments-logger directory","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/payments-logger -type f | sort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/payments-logger/API.md\n/volume2/docker/payments-logger/backend/Dockerfile\n/volume2/docker/payments-logger/backend/.dockerignore\n/volume2/docker/payments-logger/backend/package.json\n/volume2/docker/payments-logger/backend/prisma/migrations/20260210_init/migration.sql\n/volume2/docker/payments-logger/backend/prisma/migrations/20260210_simplify/migration.sql\n/volume2/docker/payments-logger/backend/prisma/migrations/20260222_add_card/migration.sql\n/volume2/docker/payments-logger/backend/prisma/migrations/20260508_add_users/migration.sql\n/volume2/docker/payments-logger/backend/prisma/migrations/migration_lock.toml\n/volume2/docker/payments-logger/backend/prisma/schema.prisma\n/volume2/docker/payments-logger/backend/src/auth.js\n/volume2/docker/payments-logger/backend/src/index.js\n/volume2/docker/payments-logger/backend/src/parser.js\n/volume2/docker/payments-logger/backend/src/routes/payments.js\n/volume2/docker/payments-logger/.claude/settings.local.json\n/volume2/docker/payments-logger/docker-compose.yml\n/volume2/docker/payments-logger/.env\n/volume2/docker/payments-logger/.env.example\n/volume2/docker/payments-logger/frontend/Dockerfile\n/volume2/docker/payments-logger/frontend/.dockerignore\n/volume2/docker/payments-logger/frontend/index.html\n/volume2/docker/payments-logger/frontend/package.json\n/volume2/docker/payments-logger/frontend/postcss.config.js\n/volume2/docker/payments-logger/frontend/src/App.jsx\n/volume2/docker/payments-logger/frontend/src/auth.js\n/volume2/docker/payments-logger/frontend/src/components/AuthProvider.jsx\n/volume2/docker/payments-logger/frontend/src/components/FilterBar.jsx\n/volume2/docker/payments-logger/frontend/src/components/PaymentCard.jsx\n/volume2/docker/payments-logger/frontend/src/components/PaymentList.jsx\n/volume2/docker/payments-logger/frontend/src/components/PaymentTable.jsx\n/volume2/docker/payments-logger/frontend/src/index.css\n/volume2/docker/payments-logger/frontend/src/main.jsx\n/volume2/docker/payments-logger/frontend/tailwind.config.js\n/volume2/docker/payments-logger/frontend/vite.config.js\n/volume2/docker/payments-logger/.gitignore\n/volume2/docker/payments-logger/README.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"List all files in dsk-uploader directory","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"find /volume2/docker/dsk-uploader -type f | sort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/volume2/docker/dsk-uploader/app_flask.py\n/volume2/docker/dsk-uploader/app.py\n/volume2/docker/dsk-uploader/docker-compose.yml\n/volume2/docker/dsk-uploader/Dockerfile\n/volume2/docker/dsk-uploader/.dockerignore\n/volume2/docker/dsk-uploader/dskuploader.py\n/volume2/docker/dsk-uploader/.env\n/volume2/docker/dsk-uploader/.env.example\n/volume2/docker/dsk-uploader/.git/COMMIT_EDITMSG\n/volume2/docker/dsk-uploader/.git/config\n/volume2/docker/dsk-uploader/.git/description\n/volume2/docker/dsk-uploader/.git/FETCH_HEAD\n/volume2/docker/dsk-uploader/.git/HEAD\n/volume2/docker/dsk-uploader/.git/hooks/applypatch-msg.sample\n/volume2/docker/dsk-uploader/.git/hooks/commit-msg.sample\n/volume2/docker/dsk-uploader/.git/hooks/fsmonitor-watchman.sample\n/volume2/docker/dsk-uploader/.git/hooks/post-update.sample\n/volume2/docker/dsk-uploader/.git/hooks/pre-applypatch.sample\n/volume2/docker/dsk-uploader/.git/hooks/pre-commit.sample\n/volume2/docker/dsk-uploader/.git/hooks/pre-merge-commit.sample\n/volume2/docker/dsk-uploader/.git/hooks/prepare-commit-msg.sample\n/volume2/docker/dsk-uploader/.git/hooks/pre-push.sample\n/volume2/docker/dsk-uploader/.git/hooks/pre-rebase.sample\n/volume2/docker/dsk-uploader/.git/hooks/pre-receive.sample\n/volume2/docker/dsk-uploader/.git/hooks/push-to-checkout.sample\n/volume2/docker/dsk-uploader/.git/hooks/update.sample\n/volume2/docker/dsk-uploader/.gitignore\n/volume2/docker/dsk-uploader/.git/index\n/volume2/docker/dsk-uploader/.git/info/exclude\n/volume2/docker/dsk-uploader/.git/logs/HEAD\n/volume2/docker/dsk-uploader/.git/logs/refs/heads/main\n/volume2/docker/dsk-uploader/.git/logs/refs/remotes/origin/HEAD\n/volume2/docker/dsk-uploader/.git/logs/refs/remotes/origin/main\n/volume2/docker/dsk-uploader/.git/objects/0b/918bed65202bedaa9fa092e539d607be2eea65\n/volume2/docker/dsk-uploader/.git/objects/11/b908125d2f0feebf7aca6d24e127f334bce611\n/volume2/docker/dsk-uploader/.git/objects/56/a2766ae5422b18e5b1a418fd231ad12fef08e6\n/volume2/docker/dsk-uploader/.git/objects/65/386fd3b4ac62094500e21c23845d05b9d18a4f\n/volume2/docker/dsk-uploader/.git/objects/7b/2d7b18213f9516ec4544f309772ee4808146bb\n/volume2/docker/dsk-uploader/.git/objects/7c/3f071fef98751a68b7d93779f76cf5d5aa8ebf\n/volume2/docker/dsk-uploader/.git/objects/85/b5483672f68c327c39ea8c29e94ae8b22b7bbf\n/volume2/docker/dsk-uploader/.git/objects/8e/a1cbf78eae8a86c5990d0582db1847c0226b56\n/volume2/docker/dsk-uploader/.git/objects/ed/8e93af8cc77c7a85f87a9f37573c51b839e571\n/volume2/docker/dsk-uploader/.git/objects/ee/3d5f92e57deec809abda371386e371f32de9bb\n/volume2/docker/dsk-uploader/.git/objects/f3/98248da8f4911d463d9a33155fcf58a65092cc\n/volume2/docker/dsk-uploader/.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.idx\n/volume2/docker/dsk-uploader/.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.pack\n/volume2/docker/dsk-uploader/.git/ORIG_HEAD\n/volume2/docker/dsk-uploader/.git/packed-refs\n/volume2/docker/dsk-uploader/.git/refs/heads/main\n/volume2/docker/dsk-uploader/.git/refs/remotes/origin/HEAD\n/volume2/docker/dsk-uploader/.git/refs/remotes/origin/main\n/volume2/docker/dsk-uploader/notion_connector/client.py\n/volume2/docker/dsk-uploader/notion_connector/exceptions/exceptions.py\n/volume2/docker/dsk-uploader/notion_connector/exceptions/__init__.py\n/volume2/docker/dsk-uploader/notion_connector/__init__.py\n/volume2/docker/dsk-uploader/notion_connector/resources/block_property.py\n/volume2/docker/dsk-uploader/notion_connector/resources/block.py\n/volume2/docker/dsk-uploader/notion_connector/resources/database_property.py\n/volume2/docker/dsk-uploader/notion_connector/resources/database.py\n/volume2/docker/dsk-uploader/notion_connector/resources/filter_builder.py\n/volume2/docker/dsk-uploader/notion_connector/resources/__init__.py\n/volume2/docker/dsk-uploader/notion_connector/resources/page_property.py\n/volume2/docker/dsk-uploader/notion_connector/resources/page.py\n/volume2/docker/dsk-uploader/notion_connector/resources/search.py\n/volume2/docker/dsk-uploader/README.md\n/volume2/docker/dsk-uploader/requirements.txt\n/volume2/docker/dsk-uploader/templates/base.html\n/volume2/docker/dsk-uploader/templates/index.html\n/volume2/docker/dsk-uploader/templates/result.html\n/volume2/docker/dsk-uploader/USAGE.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"schema.prisma","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"schema.prisma","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"parser.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"auth.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"auth.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"payments.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"App.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"App.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"FilterBar.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"FilterBar.jsx","depth":25,"on_screen":false,"role_description":"text"}]...
|
1256710512203743776
|
-4865117490310688885
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: finance [SSH: nas]
Explorer Section: finance [SSH: nas]
FINANCE [SSH: NAS]
finance
!
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
docker-compose.yml, Editor Group 1
.env, Editor Group 1
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
Design new payment-logge…, Editor Group 2
finance-hub — Implementation Plan, Editor Group 3
alert Disconnected from SSH: nas
Disconnected from SSH: nas
No Problems
0
0
No Ports Forwarded
0
Notifications
Sign In
Sign In
Info: Setting up SSH Host nas: (details) Initializing VS Code Server
Design new payment-logger and dsk-uploader hybrid app
Session history
New session
Message actions
payments.js
payments.js
ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.
Thinking
Thinking
I'll explore all three reference projects in parallel to understand their structure before planning.
Agent:
Explore payment-logger app structure and functionality
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How data flows (ingest, storage, retrieval)
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.
Agent:
Explore dsk-uploader app structure and functionality
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How file uploads work - what files, what format, how parsed
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.
Agent:
Explore auth folder and authentik integration
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. What auth system is being used (Authentik)
2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?
3. Middleware - how is auth enforced on routes?
4. Any frontend auth flow - login redirect, token handling, protected routes
5. Environment variables related to auth
6. Docker/deployment setup for the auth service itself
7. Any example of how other apps integrate with this auth
Report with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.
Message actions
payments.js
payments.js
continue
Thinking
Thinking
Launching parallel exploration of all three reference projects.
Agent:
Explore payment-logger app structure
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How data is ingested (look at /ingest route especially)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Bash
IN
find /volume2/docker/finance/payments-logger -type f -name "*.json" -o -name "*.js" -o -name "*.jsx" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.sql" -o -name "Dockerfile*" -o -name "docker-compose*" -o -name ".env*" 2>/dev/null | head -50
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/.env
/volume2/docker/finance/payments-logger/.env.example
/volume2/docker/finance/payments-logger/docker-compose.yml
/volume2/docker/finance/payments-logger/.claude/settings.local.json
/volume2/docker/finance/payments-logger/backend/Dockerfile
/volume2/docker/finance/payments-logger/backend/package.json
/volume2/docker/finance/payments-logger/frontend/Dockerfile
/volume2/docker/finance/payments-logger/frontend/package.json
/volume2/docker/finance/payments-logger/frontend/postcss.config.js
/volume2/docker/finance/payments-logger/frontend/tailwind.config.js
/volume2/docker/finance/payments-logger/frontend/vite.config.js
/volume2/docker/finance/payments-logger/auth/.env
/volume2/docker/finance/payments-logger/auth/.env.example
/volume2/docker/finance/payments-logger/backend/src/auth.js
/volume2/docker/finance/payments-logger/backend/src/index.js
/volume2/docker/finance/payments-logger/backend/src/parser.js
/volume2/docker/finance/payments-logger/frontend/src/App.jsx
/volume2/docker/finance/payments-logger/frontend/src/auth.js
/volume2/docker/finance/payments-logger/frontend/src/main.jsx
/volume2/docker/finance/payments-logger/backend/src/routes/payments.js
/volume2/docker/finance/payments-logger/frontend/src/components/AuthProvider.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentCard.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentList.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260210_init/migration.sql
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260210_simplify/migration.sql
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260222_add_card/migration.sql
/volume2/docker/finance/payments-logger/backend/prisma/migrations/20260508_add_users/migration.sql
Agent:
Explore dsk-uploader app structure
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How file uploads work (what format, what processing happens)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Bash
IN
find /volume2/docker/finance/dsk-uploader -type f -name "*.json" -o -type f -name "*.yml" -o -type f -name "*.yaml" | head -30
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader/docker-compose.yml
Bash
IN
cd /volume2/docker/finance/payments-logger && find . -type f \( -name "*.json" -o -name "*.js" -o -name "*.jsx" -o -name "*.ts" -o -name "*.tsx" -o -name "*.sql" -o -name "*.yml" -o -name "*.yaml" -o -name "Dockerfile*" -o -name ".env*" \) | grep -v node_modules | sort
Copy code to clipboard
OUT
./auth/.env
./auth/.env.example
./backend/Dockerfile
./backend/package.json
./backend/prisma/migrations/20260210_init/migration.sql
./backend/prisma/migrations/20260210_simplify/migration.sql
./backend/prisma/migrations/20260222_add_card/migration.sql
./backend/prisma/migrations/20260508_add_users/migration.sql
./backend/src/auth.js
./backend/src/index.js
./backend/src/parser.js
./backend/src/routes/payments.js
./.claude/settings.local.json
./docker-compose.yml
./.env
./.env.example
./frontend/Dockerfile
./frontend/package.json
./frontend/postcss.config.js
./frontend/src/App.jsx
./frontend/src/auth.js
./frontend/src/components/AuthProvider.jsx
./frontend/src/components/FilterBar.jsx
./frontend/src/components/PaymentCard.jsx
./frontend/src/components/PaymentList.jsx
./frontend/src/components/PaymentTable.jsx
./frontend/src/main.jsx
./frontend/tailwind.config.js
./frontend/vite.config.js
Agent:
Explore auth project structure
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. What authentication system is used (authentik integration details)
3. How OAuth/OIDC flow works
4. Any middleware or helper functions for protecting routes
5. Session management approach
6. How frontend handles auth state
7. Any example of how other apps integrate with this auth system
8. Docker setup and environment variables
Please read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.
Bash
IN
cd /volume2/docker/finance/dsk-uploader && find . -type f | head -100
Copy code to clipboard
OUT
./.gitignore
./README.md
./USAGE.md
./app.py
./app_flask.py
./dskuploader.py
./requirements.txt
./.env
./.env.example
./Dockerfile
./docker-compose.yml
./.dockerignore
./.git/description
./.git/packed-refs
./.git/HEAD
./.git/FETCH_HEAD
./.git/index
./.git/COMMIT_EDITMSG
./.git/ORIG_HEAD
./notion_connector/__init__.py
./notion_connector/client.py
./templates/base.html
./templates/index.html
./templates/result.html
./notion_connector/resources/__init__.py
./notion_connector/resources/block.py
./notion_connector/resources/block_property.py
./notion_connector/resources/database.py
./notion_connector/resources/database_property.py
./notion_connector/resources/filter_builder.py
./notion_connector/resources/page.py
./notion_connector/resources/page_property.py
./notion_connector/resources/search.py
./.git/info/exclude
./.git/hooks/post-update.sample
./.git/hooks/pre-applypatch.sample
./.git/hooks/pre-commit.sample
./.git/hooks/applypatch-msg.sample
./.git/hooks/pre-rebase.sample
./.git/hooks/pre-merge-commit.sample
./.git/hooks/update.sample
./.git/hooks/pre-push.sample
./.git/hooks/push-to-checkout.sample
./.git/hooks/prepare-commit-msg.sample
./.git/hooks/commit-msg.sample
./.git/hooks/pre-receive.sample
./.git/hooks/fsmonitor-watchman.sample
./.git/logs/HEAD
./notion_connector/exceptions/__init__.py
./notion_connector/exceptions/exceptions.py
./.git/config
./.git/refs/heads/main
./.git/refs/remotes/origin/HEAD
./.git/refs/remotes/origin/main
./.git/objects/7c/3f071fef98751a68b7d93779f76cf5d5aa8ebf
./.git/objects/ed/8e93af8cc77c7a85f87a9f37573c51b839e571
./.git/objects/7b/2d7b18213f9516ec4544f309772ee4808146bb
./.git/objects/65/386fd3b4ac62094500e21c23845d05b9d18a4f
./.git/objects/ee/3d5f92e57deec809abda371386e371f32de9bb
./.git/logs/refs/heads/main
./.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.pack
./.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.idx
./.git/objects/85/b5483672f68c327c39ea8c29e94ae8b22b7bbf
./.git/objects/f3/98248da8f4911d463d9a33155fcf58a65092cc
./.git/objects/0b/918bed65202bedaa9fa092e539d607be2eea65
./.git/objects/8e/a1cbf78eae8a86c5990d0582db1847c0226b56
./.git/objects/11/b908125d2f0feebf7aca6d24e127f334bce611
./.git/objects/56/a2766ae5422b18e5b1a418fd231ad12fef08e6
./.git/logs/refs/remotes/origin/HEAD
./.git/logs/refs/remotes/origin/main
Bash
IN
find /volume2/docker/finance/auth -type f -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.json" -o -name "*.yaml" -o -name "*.yml" -o -name "*.env*" -o -name "Dockerfile*" | head -100
Copy code to clipboard
OUT
/volume2/docker/finance/auth/.env
/volume2/docker/finance/auth/.env.example
/volume2/docker/finance/auth/docker-compose.yml
/volume2/docker/finance/auth/auth/.env
/volume2/docker/finance/auth/auth/.env.example
/volume2/docker/finance/auth/auth/docker-compose.yml
Read
dsk-uploader
dsk-uploader
Read
docker-compose.yml
docker-compose.yml
Read
package.json
package.json
Read
package.json
package.json
Read
.env.example
.env.example
Bash
IN
ls -la /volume2/docker/finance/auth/ && echo "---" && find /volume2/docker/finance/auth -type d | sort
Copy code to clipboard
OUT
total 20
drwxrwxrwx 1 Adm1n admin 108 May 8 21:08 .
drwxrwxrwx 1 Adm1n admin 62 May 8 21:10 ..
drwxrwxrwx 1 Adm1n admin 128 May 8 21:08 auth
drwxrwxrwx 1 Adm1n admin 0 May 8 21:06 certs
drwxrwxrwx 1 Adm1n admin 0 May 8 21:06 db
-rwxrwxrwx 1 Adm1n admin 3328 May 8 21:07 docker-compose.yml
-rwxrwxrwx 1 Adm1n admin 949 May 8 21:06 .env
-rwxrwxrwx 1 Adm1n admin 2258 May 8 21:06 .env.example
-rwxrwxrwx 1 Adm1n admin 5501 May 8 21:07 README.md
---
/volume2/docker/finance/auth
/volume2/docker/finance/auth/auth
/volume2/docker/finance/auth/auth/certs
/volume2/docker/finance/auth/auth/db
/volume2/docker/finance/auth/auth/db/base
/volume2/docker/finance/auth/auth/db/base/1
/volume2/docker/finance/auth/auth/db/base/16384
/volume2/docker/finance/auth/auth/db/base/4
/volume2/docker/finance/auth/auth/db/base/5
/volume2/docker/finance/auth/auth/db/global
/volume2/docker/finance/auth/auth/db/pg_commit_ts
/volume2/docker/finance/auth/auth/db/pg_dynshmem
/volume2/docker/finance/auth/auth/db/pg_logical
/volume2/docker/finance/auth/auth/db/pg_logical/mappings
/volume2/docker/finance/auth/auth/db/pg_logical/snapshots
/volume2/docker/finance/auth/auth/db/pg_multixact
/volume2/docker/finance/auth/auth/db/pg_multixact/members
/volume2/docker/finance/auth/auth/db/pg_multixact/offsets
/volume2/docker/finance/auth/auth/db/pg_notify
/volume2/docker/finance/auth/auth/db/pg_replslot
/volume2/docker/finance/auth/auth/db/pg_serial
/volume2/docker/finance/auth/auth/db/pg_snapshots
/volume2/docker/finance/auth/auth/db/pg_stat
/volume2/docker/finance/auth/auth/db/pg_stat_tmp
/volume2/docker/finance/auth/auth/db/pg_subtrans
/volume2/docker/finance/auth/auth/db/pg_tblspc
/volume2/docker/finance/auth/auth/db/pg_twophase
/volume2/docker/finance/auth/auth/db/pg_wal
/volume2/docker/finance/auth/auth/db/pg_wal/archive_status
/volume2/docker/finance/auth/auth/db/pg_xact
/volume2/docker/finance/auth/auth/media
/volume2/docker/finance/auth/auth/templates
/volume2/docker/finance/auth/certs
/volume2/docker/finance/auth/db
Read
README.md
README.md
Read
requirements.txt
requirements.txt
Read
index.js
index.js
Read
payments.js
payments.js
Read
auth.js
auth.js
Read
README.md
README.md
Read
.env
.env
Read
.env.example
.env.example
Read
docker-compose.yml
docker-compose.yml
Read
parser.js
parser.js
Bash
IN
find /volume2/docker/finance/auth/auth -type f | grep -v "^/volume2/docker/finance/auth/auth/db" | grep -v "^/volume2/docker/finance/auth/auth/certs" | grep -v "^/volume2/docker/finance/auth/auth/media" | sort
Copy code to clipboard
OUT
/volume2/docker/finance/auth/auth/docker-compose.yml
/volume2/docker/finance/auth/auth/.env
/volume2/docker/finance/auth/auth/.env.example
/volume2/docker/finance/auth/auth/README.md
Read
migration.sql
migration.sql
Read
migration.sql
migration.sql
Read
README.md
README.md
Read
.env
.env
Read
.env.example
.env.example
Read
docker-compose.yml
docker-compose.yml
Read
App.jsx
App.jsx
Read
main.jsx
main.jsx
Read
auth.js
auth.js
Bash
IN
find /volume2/docker/finance -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.tsx" 2>/dev/null | head -50
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader/app.py
/volume2/docker/finance/dsk-uploader/app_flask.py
/volume2/docker/finance/dsk-uploader/dskuploader.py
/volume2/docker/finance/payments-logger/frontend/postcss.config.js
/volume2/docker/finance/payments-logger/frontend/tailwind.config.js
/volume2/docker/finance/payments-logger/frontend/vite.config.js
/volume2/docker/finance/dsk-uploader/notion_connector/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/client.py
/volume2/docker/finance/payments-logger/backend/src/auth.js
/volume2/docker/finance/payments-logger/backend/src/index.js
/volume2/docker/finance/payments-logger/backend/src/parser.js
/volume2/docker/finance/payments-logger/frontend/src/auth.js
/volume2/docker/finance/dsk-uploader/notion_connector/resources/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/block.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/block_property.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/database.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/database_property.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/filter_builder.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/page.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/page_property.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/search.py
/volume2/docker/finance/payments-logger/backend/src/routes/payments.js
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/exceptions.py
Read
AuthProvider.jsx
AuthProvider.jsx
Read
PaymentTable.jsx
PaymentTable.jsx
Read
FilterBar.jsx
FilterBar.jsx
Read
auth.js
auth.js
Read
auth.js
auth.js
Read
index.js
index.js
Read
Dockerfile
Dockerfile
Read
Dockerfile
Dockerfile
Read
migration.sql
migration.sql
Bash
IN
find /volume2/docker/finance/payments-logger -name "docker-compose.yml" -o -name ".env*" -o -name "package.json" | head -20
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/.env
/volume2/docker/finance/payments-logger/.env.example
/volume2/docker/finance/payments-logger/docker-compose.yml
/volume2/docker/finance/payments-logger/backend/package.json
/volume2/docker/finance/payments-logger/frontend/package.json
/volume2/docker/finance/payments-logger/auth/.env
/volume2/docker/finance/payments-logger/auth/.env.example
Bash
IN
find /volume2/docker/finance/payments-logger -name "schema.prisma" -type f
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma
Read
docker-compose.yml
docker-compose.yml
Read
.env
.env
Read
.env.example
.env.example
Read
schema.prisma
schema.prisma
Bash
IN
ls -la /volume2/docker/finance/payments-logger/auth/ && echo "---" && find /volume2/docker/finance/payments-logger -name "Dockerfile*" | head -10
Copy code to clipboard
OUT
total 16
drwxrwxrwx 1 Adm1n admin 64 May 8 21:07 .
drwxrwxrwx 1 Adm1n admin 170 May 8 21:07 ..
drwxrwxrwx 1 Adm1n admin 0 May 8 21:07 certs
drwxrwxrwx 1 Adm1n admin 0 May 8 21:07 db
-rwxrwxrwx 1 Adm1n admin 949 May 8 21:07 .env
-rwxrwxrwx 1 Adm1n admin 2258 May 8 21:07 .env.example
-rwxrwxrwx 1 Adm1n admin 5501 May 8 21:07 README.md
---
/volume2/docker/finance/payments-logger/backend/Dockerfile
/volume2/docker/finance/payments-logger/frontend/Dockerfile
Bash
IN
cd /volume2/docker/finance/payments-logger && tree -L 3 -I 'node_modules|.next|dist|build' --charset ascii 2>/dev/null || find . -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -type f | head -60
Copy code to clipboard
OUT
.
|-- API.md
|-- auth
| |-- certs
| |-- db
| `-- README.md
|-- backend
| |-- Dockerfile
| |-- package.json
| |-- prisma
| | |-- migrations
| | `-- schema.prisma
| `-- src
| |-- auth.js
| |-- index.js
| |-- parser.js
| `-- routes
|-- docker-compose.yml
|-- frontend
| |-- Dockerfile
| |-- index.html
| |-- package.json
| |-- postcss.config.js
| |-- src
| | |-- App.jsx
| | |-- auth.js
| | |-- components
| | |-- index.css
| | `-- main.jsx
| |-- tailwind.config.js
| `-- vite.config.js
`-- README.md
12 directories, 20 files
Read
.env
.env
Read
.env.example
.env.example
Read
Dockerfile
Dockerfile
Read
Dockerfile
Dockerfile
Bash
IN
head -100 /volume2/docker/finance/payments-logger/backend/package.json && echo "---FRONTEND---" && head -100 /volume2/docker/finance/payments-logger/frontend/package.json
Copy code to clipboard
OUT
{
"name": "payments-logger-backend",
"version": "1.0.0",
"description": "Payment SMS logger backend",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js",
"prisma:generate": "prisma generate",
"prisma:migrate": "prisma migrate deploy",
"prisma:migrate:dev": "prisma migrate dev"
},
"dependencies": {
"@prisma/client": "^5.22.0",
"bcryptjs": "^2.4.3",
"cors": "^2.8.5",
"express": "^4.21.1",
"express-rate-limit": "^7.4.0",
"jose": "^5.9.6",
"morgan": "^1.10.0"
},
"devDependencies": {
"nodemon": "^3.1.7",
"prisma": "^5.22.0"
}
}
---FRONTEND---
{
"name": "payments-logger-frontend",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"lucide-react": "^0.460.0",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
"devDependencies": {
"@types/react": "^18.3.12",
"@vitejs/plugin-react": "^4.3.4",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"vite": "^6.0.1"
}
}
Read
payments.js
payments.js
Bash
IN
find /volume2/docker/finance -name "*.md" -type f | xargs grep -l "auth\|Authentik\|OAuth\|OIDC" 2>/dev/null | head -5
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/API.md
/volume2/docker/finance/auth/README.md
/volume2/docker/finance/auth/auth/README.md
/volume2/docker/finance/payments-logger/auth/README.md
Read
API.md
API.md
Bash
IN
head -50 /volume2/docker/finance/payments-logger/frontend/src/main.jsx
Copy code to clipboard
OUT
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { AuthProvider } from './components/AuthProvider';
import './index.css';
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<AuthProvider>
<App />
</AuthProvider>
</React.StrictMode>
);
Bash
IN
find /volume2/docker/finance/payments-logger/frontend/src -name "*.jsx" -o -name "*.js" | head -20
Copy code to clipboard
OUT
/volume2/docker/finance/payments-logger/frontend/src/App.jsx
/volume2/docker/finance/payments-logger/frontend/src/auth.js
/volume2/docker/finance/payments-logger/frontend/src/main.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/AuthProvider.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentCard.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentList.jsx
/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx
Read
AuthProvider.jsx
AuthProvider.jsx
Read
AuthProvider.jsx
AuthProvider.jsx
Bash
IN
head -50 /volume2/docker/finance/payments-logger/frontend/src/App.jsx
Copy code to clipboard
OUT
import React, { useState, useEffect, useCallback } from 'react';
import { CreditCard, RefreshCw, LogOut } from 'lucide-react';
import FilterBar from './components/FilterBar';
import PaymentTable from './components/PaymentTable';
import { useAuth } from './components/AuthProvider';
const API_BASE = '/api/payments';
export default function App() {
const { logout, getToken } = useAuth();
const [payments, setPayments] = useState([]);
const [total, setTotal] = useState(0);
const [page, setPage] = useState(1);
const [filters, setFilters] = useState({});
const [sortBy, setSortBy] = useState('createdAt');
const [sortDir, setSortDir] = useState('desc');
const [filterOptions, setFilterOptions] = useState({ types: [], recipients: [], tags: [] });
const [loading, setLoading] = useState(false);
const authFetch = useCallback(async (url, options = {}) => {
const token = await getToken();
const headers = { ...(options.headers || {}) };
if (token) headers['Authorization'] = `Bearer ${token}`;
return fetch(url, { ...options, headers });
}, [getToken]);
const fetchPayments = useCallback(async () => {
setLoading(true);
try {
const params = new URLSearchParams();
params.set('page', page);
params.set('limit', 50);
params.set('sortBy', sortBy);
params.set('sortDir', sortDir);
Object.entries(filters).forEach(([key, val]) => {
if (val) params.set(key, val);
});
const res = await authFetch(`${API_BASE}?${params}`);
const data = await res.json();
setPayments(data.payments || []);
setTotal(data.total || 0);
} catch (err) {
console.error('Failed to fetch payments:', err);
} finally {
setLoading(false);
}
}, [page, filters, sortBy, sortDir, authFetch]);
const fetchFilterOptions = useCallback(async () => {
try {
Read
docker-compose.yml
docker-compose.yml
Read
Dockerfile
Dockerfile
Read
.env.example
.env.example
Read
app.py
app.py
Read
app_flask.py
app_flask.py
Read
dskuploader.py
dskuploader.py
Read
client.py
client.py
Read
database.py
database.py
Read
index.html
index.html
Read
base.html
base.html
Read
result.html
result.html
Read
page_property.py
page_property.py
Read
USAGE.md
USAGE.md
Bash
IN
find /volume2/docker/finance/dsk-uploader -type f \( -name "*.py" -o -name "*.json" \) | grep -E "(exceptions|page\.py)" | head -10
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/__init__.py
/volume2/docker/finance/dsk-uploader/notion_connector/exceptions/exceptions.py
/volume2/docker/finance/dsk-uploader/notion_connector/resources/page.py
Read
page.py
page.py
Read
exceptions.py
exceptions.py
Bash
IN
tree -L 3 /volume2/docker/finance/dsk-uploader 2>/dev/null | head -80 || find /volume2/docker/finance/dsk-uploader -type d -not -path '.*/.git/*' | sort
Copy code to clipboard
OUT
/volume2/docker/finance/dsk-uploader
├── app_flask.py
├── app.py
├── docker-compose.yml
├── Dockerfile
├── dskuploader.py
├── notion_connector
│ ├── client.py
│ ├── exceptions
│ │ ├── exceptions.py
│ │ └── __init__.py
│ ├── __init__.py
│ └── resources
│ ├── block_property.py
│ ├── block.py
│ ├── database_property.py
│ ├── database.py
│ ├── filter_builder.py
│ ├── __init__.py
│ ├── page_property.py
│ ├── page.py
│ └── search.py
├── README.md
├── requirements.txt
├── templates
│ ├── base.html
│ ├── index.html
│ └── result.html
└── USAGE.md
5 directories, 24 files
Read
README.md
README.md
Read
API.md
API.md
Thinking
Thinking
Now I have a complete picture of all three. Let me design the plan.
Agent:
Design combined app architecture
IN
Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:
---
## App 1: payments-logger (Node.js)
- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI
- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS
- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage
- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)
- **Schema** (PostgreSQL via Prisma):
- `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at
- `tags` table: id, name, color — M2M with payments via `_PaymentToTag`
- `users` table: id, username, hashed_password (this will be REMOVED)
- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system
- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance
## App 2: dsk-uploader (Python/Flask)
- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database
- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5
- **Auth**: None (open)
- **CSV format** (DSK Bank Bulgarian format, columns):
- `Дата` (date, DD.MM.YYYY)
- `Вид на трансакцията` (transaction type, Bulgarian)
- `Основание` (reason/description — contains card number regex: `^\d{6}x{6}\d{4}$`)
- `Дебит BGN` (debit amount, may be empty)
- `Кредит BGN` (credit amount, may be empty)
- `Наредител/Получател` (orderer/recipient name)
- `Номер сметка на наредителя / получателя` (account number)
- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers
- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)
## App 3: auth (Authentik)
- **Mode**: Proxy mode via NPM (forward auth)
- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:
- `X-authentik-username`
- `X-authentik-email`
- `X-authentik-groups`
- **No code integration needed** in the app itself — just trust these headers from NPM
- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`
---
## What the New Combined App Must Do
1. **Single PostgreSQL database** for all transactions
2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST
3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema
4. **Unified UI** — show all payments in one table regardless of source
5. **Source indicator** in UI — badge showing "INGEST", "UPLOAD", or "BOTH" (if duplicate detection added)
6. **Source filter** in FilterBar — filter by All/Ingest/Upload
7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM
8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination
9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL
---
## Technical Constraints
- Keep Node.js backend (not Python) — extend payments-logger's stack
- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)
- File upload: use `multer` npm middleware
- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)
- Add `source` enum field (INGEST/UPLOAD) to payments schema
- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is
- Remove `users` table from schema
---
## Please Design
1. Complete folder structure for the new app (suggest name: "finance-hub" or similar — note this is a placeholder, user will confirm)
2. Prisma schema with new fields (`source`, `currency`)
3. All backend API routes
4. CSV parser design in Node.js (port of the Python logic)
5. Authentik auth middleware
6. Frontend component structure (React) — what's reused from payments-logger, what's new
7. Docker Compose setup
8. Environment variables needed
9. Step-by-step implementation order
10. Verification checklist
Be specific about file paths and code structure. This will be used to write actual implementation code.
Bash
List all files in finance directory
IN
find /volume2/docker/finance -type f | sort | head -100
Copy code to clipboard
OUT
/volume2/docker/finance/auth/auth/db/base/1/112
/volume2/docker/finance/auth/auth/db/base/1/113
/volume2/docker/finance/auth/auth/db/base/1/1247
/volume2/docker/finance/auth/auth/db/base/1/1247_fsm
/volume2/docker/finance/auth/auth/db/base/1/1247_vm
/volume2/docker/finance/auth/auth/db/base/1/1249
/volume2/docker/finance/auth/auth/db/base/1/1249_fsm
/volume2/docker/finance/auth/auth/db/base/1/1249_vm
/volume2/docker/finance/auth/auth/db/base/1/1255
/volume2/docker/finance/auth/auth/db/base/1/1255_fsm
/volume2/docker/finance/auth/auth/db/base/1/1255_vm
/volume2/docker/finance/auth/auth/db/base/1/1259
/volume2/docker/finance/auth/auth/db/base/1/1259_fsm
/volume2/docker/finance/auth/auth/db/base/1/1259_vm
/volume2/docker/finance/auth/auth/db/base/1/13457
/volume2/docker/finance/auth/auth/db/base/1/13457_fsm
/volume2/docker/finance/auth/auth/db/base/1/13457_vm
/volume2/docker/finance/auth/auth/db/base/1/13460
/volume2/docker/finance/auth/auth/db/base/1/13461
/volume2/docker/finance/auth/auth/db/base/1/13462
/volume2/docker/finance/auth/auth/db/base/1/13462_fsm
/volume2/docker/finance/auth/auth/db/base/1/13462_vm
/volume2/docker/finance/auth/auth/db/base/1/13465
/volume2/docker/finance/auth/auth/db/base/1/13466
/volume2/docker/finance/auth/auth/db/base/1/13467
/volume2/docker/finance/auth/auth/db/base/1/13467_fsm
/volume2/docker/finance/auth/auth/db/base/1/13467_vm
/volume2/docker/finance/auth/auth/db/base/1/13470
/volume2/docker/finance/auth/auth/db/base/1/13471
/volume2/docker/finance/auth/auth/db/base/1/13472
/volume2/docker/finance/auth/auth/db/base/1/13472_fsm
/volume2/docker/finance/auth/auth/db/base/1/13472_vm
/volume2/docker/finance/auth/auth/db/base/1/13475
/volume2/docker/finance/auth/auth/db/base/1/13476
/volume2/docker/finance/auth/auth/db/base/1/1417
/volume2/docker/finance/auth/auth/db/base/1/1418
/volume2/docker/finance/auth/auth/db/base/1/174
/volume2/docker/finance/auth/auth/db/base/1/175
/volume2/docker/finance/auth/auth/db/base/1/2187
/volume2/docker/finance/auth/auth/db/base/1/2224
/volume2/docker/finance/auth/auth/db/base/1/2228
/volume2/docker/finance/auth/auth/db/base/1/2328
/volume2/docker/finance/auth/auth/db/base/1/2336
/volume2/docker/finance/auth/auth/db/base/1/2337
/volume2/docker/finance/auth/auth/db/base/1/2579
/volume2/docker/finance/auth/auth/db/base/1/2600
/volume2/docker/finance/auth/auth/db/base/1/2600_fsm
/volume2/docker/finance/auth/auth/db/base/1/2600_vm
/volume2/docker/finance/auth/auth/db/base/1/2601
/volume2/docker/finance/auth/auth/db/base/1/2601_fsm
/volume2/docker/finance/auth/auth/db/base/1/2601_vm
/volume2/docker/finance/auth/auth/db/base/1/2602
/volume2/docker/finance/auth/auth/db/base/1/2602_fsm
/volume2/docker/finance/auth/auth/db/base/1/2602_vm
/volume2/docker/finance/auth/auth/db/base/1/2603
/volume2/docker/finance/auth/auth/db/base/1/2603_fsm
/volume2/docker/finance/auth/auth/db/base/1/2603_vm
/volume2/docker/finance/auth/auth/db/base/1/2604
/volume2/docker/finance/auth/auth/db/base/1/2605
/volume2/docker/finance/auth/auth/db/base/1/2605_fsm
/volume2/docker/finance/auth/auth/db/base/1/2605_vm
/volume2/docker/finance/auth/auth/db/base/1/2606
/volume2/docker/finance/auth/auth/db/base/1/2606_fsm
/volume2/docker/finance/auth/auth/db/base/1/2606_vm
/volume2/docker/finance/auth/auth/db/base/1/2607
/volume2/docker/finance/auth/auth/db/base/1/2607_fsm
/volume2/docker/finance/auth/auth/db/base/1/2607_vm
/volume2/docker/finance/auth/auth/db/base/1/2608
/volume2/docker/finance/auth/auth/db/base/1/2608_fsm
/volume2/docker/finance/auth/auth/db/base/1/2608_vm
/volume2/docker/finance/auth/auth/db/base/1/2609
/volume2/docker/finance/auth/auth/db/base/1/2609_fsm
/volume2/docker/finance/auth/auth/db/base/1/2609_vm
/volume2/docker/finance/auth/auth/db/base/1/2610
/volume2/docker/finance/auth/auth/db/base/1/2610_fsm
/volume2/docker/finance/auth/auth/db/base/1/2610_vm
/volume2/docker/finance/auth/auth/db/base/1/2611
/volume2/docker/finance/auth/auth/db/base/1/2612
/volume2/docker/finance/auth/auth/db/base/1/2612_fsm
/volume2/docker/finance/auth/auth/db/base/1/2612_vm
/volume2/docker/finance/auth/auth/db/base/1/2613
/volume2/docker/finance/auth/auth/db/base/1/2615
/volume2/docker/finance/auth/auth/db/base/1/2615_fsm
/volume2/docker/finance/auth/auth/db/base/1/2615_vm
/volume2/docker/finance/auth/auth/db/base/1/2616
/volume2/docker/finance/auth/auth/db/base/1/2616_fsm
/volume2/docker/finance/auth/auth/db/base/1/2616_vm
/volume2/docker/finance/auth/auth/db/base/1/2617
/volume2/docker/finance/auth/auth/db/base/1/2617_fsm
/volume2/docker/finance/auth/auth/db/base/1/2617_vm
/volume2/docker/finance/auth/auth/db/base/1/2618
/volume2/docker/finance/auth/auth/db/base/1/2618_fsm
/volume2/docker/finance/auth/auth/db/base/1/2618_vm
/volume2/docker/finance/auth/auth/db/base/1/2619
/volume2/docker/finance/auth/auth/db/base/1/2619_fsm
/volume2/docker/finance/auth/auth/db/base/1/2619_vm
/volume2/docker/finance/auth/auth/db/base/1/2620
/volume2/docker/finance/auth/auth/db/base/1/2650
/volume2/docker/finance/auth/auth/db/base/1/2651
/volume2/docker/finance/auth/auth/db/base/1/2652
Bash
List docker directory contents
IN
ls -la /volume2/docker/
Copy code to clipboard
OUT
total 40
drwxrwxrwx 1 root root 1160 May 8 21:05 .
drwxr-xr-x 1 root root 246 Apr 6 19:54 ..
drwxrwxrwx 1 Adm1n admin 20 Jul 28 2025 adguard
drwxrwxrwx 1 Adm1n admin 66 Apr 5 13:14 ai-stack
drwxrwxrwx 1 Adm1n admin 12 Aug 1 2025 app-db
drwxrwxr-x 1 appflowy users 138 Dec 14 18:21 appflowy
drwxrwxrwx 1 Adm1n admin 72 May 6 14:55 audiobookshelf
drwxrwxrwx 1 Adm1n admin 128 Mar 30 19:52 auth
drwxrwxrwx 1 Adm1n admin 102 May 8 21:02 beszel
drwxrwxrwx 1 Adm1n admin 38 Jun 16 2025 bitwarden
drwxrwxrwx 1 Adm1n admin 36 Aug 25 2025 dawarich
drwxrwxrwx 1 Adm1n admin 322 Aug 15 2025 dsk-uploader
-rwxrwxrwx 1 Adm1n admin 10244 Oct 29 2025 .DS_Store
drwxrwxrwx 1 Adm1n admin 62 May 8 21:10 finance
drwxrwxrwx 1 Adm1n admin 92 Aug 19 2025 flask-app
drwxrwxrwx 1 Adm1n admin 308 Oct 7 2025 garmin-connector
drwxrwxrwx 1 Adm1n admin 12 Jul 18 2025 gitea
drwxrwxrwx 1 Adm1n admin 0 Feb 16 19:30 health
drwxrwxrwx 1 Adm1n admin 220 Feb 16 21:09 health-tracker
drwxrwxrwx 1 Adm1n admin 0 Oct 31 2025 homarr
drwxrwxrwx 1 Adm1n admin 146 Mar 7 20:46 hst
drwxrwxrwx 1 Adm1n admin 66 Aug 31 2025 immich
drwxrwx--- 1 Adm1n Media 30 Jun 15 2025 jellyfinht
drwxrwxrwx 1 Adm1n admin 20 Aug 31 2025 kavita
drwxrwxrwx 1 Adm1n admin 0 Oct 12 2025 libreoffice
drwxrwxrwx 1 Adm1n admin 12 Dec 13 21:12 linkwarden
drwxrwxrwx 1 Adm1n admin 274 Apr 9 19:39 location-logger
drwxrwxrwx 1 dnsmasq systemd-journal 432 Aug 27 2025 mariadb
drwxrwxrwx 1 Adm1n admin 122 Apr 26 19:03 meeting-detector
drwxrwxrwx 1 Adm1n admin 0 Aug 15 2025 mindfulmama
drwxrwxrwx 1 Adm1n admin 22 Jul 16 2025 n8n
drwxrwxrwx 1 Adm1n admin 176 Feb 20 17:33 notifier-app
drwxrwxrwx 1 Adm1n admin 52 Jun 15 2025 npm
drwxrwxrwx 1 Adm1n admin 306 Mar 29 17:34 oauth
drwxrwxrwx 1 Adm1n admin 92 Jun 15 2025 obsidian
drwxr-xr-x 1 root root 60 Mar 7 20:56 ollama
drwxr-xr-x 1 911 911 128 Jul 28 2025 openttd
drwxrwxrwx 1 Adm1n admin 234 Mar 7 16:30 openvpn-client
drwxr-xr-x 1 root root 58 May 2 23:15 open-webui
drwxrwxrwx 1 Adm1n admin 134 Dec 31 13:13 orchestrator
drwxrwxrwx 1 Adm1n admin 406 Mar 25 20:39 outfit-app
drwxrwxrwx 1 Adm1n admin 90 Aug 28 2025 owntracks-stack
drwxrwxrwx 1 Adm1n admin 156 Mar 10 20:51 paperlessngx
drwxrwxrwx 1 Adm1n admin 162 May 8 20:36 payments-logger
drwxrwxrwx 1 Adm1n admin 0 Sep 28 2025 personal-log
drwxrwxrwx 1 Adm1n admin 616 Mar 7 20:46 personal-log-system
drwxrwxrwx 1 Adm1n admin 26 Feb 19 19:41 player
drwxrwxrwx 1 Adm1n admin 202 Feb 23 21:35 portainer
drwxrwxrwx 1 dnsmasq admin 484 Dec 4 19:31 portnotedb
drwxrwxrwx 1 Adm1n admin 140 Apr 4 15:49 reminders-app
drwxrwxrwx 1 Adm1n admin 60 Oct 29 2025 romm
drwxrwxrwx 1 Adm1n admin 108 Feb 23 20:15 second-brain
drwxrwxrwx 1 Adm1n admin 10 Dec 30 17:16 static
drwxrwxrwx 1 Adm1n admin 28 Jun 19 2025 stirling
drwxrwxrwx 1 Adm1n admin 86 Oct 25 2025 syncthing
drwxrwxrwx 1 root root 56 Jun 5 2025 tailscale
drwxrwxrwx 1 Adm1n admin 186 Sep 23 2025 temp-logger
drwxrwxrwx 1 Adm1n admin 122 Jul 19 2025 test-app
drwxrwxrwx 1 Adm1n admin 52 Jun 14 2025 tmp
drwxrwxrwx 1 Adm1n admin 36 Jul 13 2025 torrent-stack
drwxrwxrwx 1 Adm1n admin 48 Dec 19 10:58 tree
drwxrwxrwx 1 Adm1n admin 0 Oct 31 2025 trilium
drwxrwxrwx 1 Adm1n admin 34 Dec 3 21:18 tubearchivist
drwxrwxrwx 1 Adm1n admin 22 Jul 25 2025 twenty
drwxrwxrwx 1 Adm1n admin 0 Nov 2 2025 uptimekuma
drwxrwxrwx 1 Adm1n admin 30 Dec 7 17:30 ytptube
Bash
List all files in payments-logger directory
IN
find /volume2/docker/payments-logger -type f | sort
Copy code to clipboard
OUT
/volume2/docker/payments-logger/API.md
/volume2/docker/payments-logger/backend/Dockerfile
/volume2/docker/payments-logger/backend/.dockerignore
/volume2/docker/payments-logger/backend/package.json
/volume2/docker/payments-logger/backend/prisma/migrations/20260210_init/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/20260210_simplify/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/20260222_add_card/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/20260508_add_users/migration.sql
/volume2/docker/payments-logger/backend/prisma/migrations/migration_lock.toml
/volume2/docker/payments-logger/backend/prisma/schema.prisma
/volume2/docker/payments-logger/backend/src/auth.js
/volume2/docker/payments-logger/backend/src/index.js
/volume2/docker/payments-logger/backend/src/parser.js
/volume2/docker/payments-logger/backend/src/routes/payments.js
/volume2/docker/payments-logger/.claude/settings.local.json
/volume2/docker/payments-logger/docker-compose.yml
/volume2/docker/payments-logger/.env
/volume2/docker/payments-logger/.env.example
/volume2/docker/payments-logger/frontend/Dockerfile
/volume2/docker/payments-logger/frontend/.dockerignore
/volume2/docker/payments-logger/frontend/index.html
/volume2/docker/payments-logger/frontend/package.json
/volume2/docker/payments-logger/frontend/postcss.config.js
/volume2/docker/payments-logger/frontend/src/App.jsx
/volume2/docker/payments-logger/frontend/src/auth.js
/volume2/docker/payments-logger/frontend/src/components/AuthProvider.jsx
/volume2/docker/payments-logger/frontend/src/components/FilterBar.jsx
/volume2/docker/payments-logger/frontend/src/components/PaymentCard.jsx
/volume2/docker/payments-logger/frontend/src/components/PaymentList.jsx
/volume2/docker/payments-logger/frontend/src/components/PaymentTable.jsx
/volume2/docker/payments-logger/frontend/src/index.css
/volume2/docker/payments-logger/frontend/src/main.jsx
/volume2/docker/payments-logger/frontend/tailwind.config.js
/volume2/docker/payments-logger/frontend/vite.config.js
/volume2/docker/payments-logger/.gitignore
/volume2/docker/payments-logger/README.md
Bash
List all files in dsk-uploader directory
IN
find /volume2/docker/dsk-uploader -type f | sort
Copy code to clipboard
OUT
/volume2/docker/dsk-uploader/app_flask.py
/volume2/docker/dsk-uploader/app.py
/volume2/docker/dsk-uploader/docker-compose.yml
/volume2/docker/dsk-uploader/Dockerfile
/volume2/docker/dsk-uploader/.dockerignore
/volume2/docker/dsk-uploader/dskuploader.py
/volume2/docker/dsk-uploader/.env
/volume2/docker/dsk-uploader/.env.example
/volume2/docker/dsk-uploader/.git/COMMIT_EDITMSG
/volume2/docker/dsk-uploader/.git/config
/volume2/docker/dsk-uploader/.git/description
/volume2/docker/dsk-uploader/.git/FETCH_HEAD
/volume2/docker/dsk-uploader/.git/HEAD
/volume2/docker/dsk-uploader/.git/hooks/applypatch-msg.sample
/volume2/docker/dsk-uploader/.git/hooks/commit-msg.sample
/volume2/docker/dsk-uploader/.git/hooks/fsmonitor-watchman.sample
/volume2/docker/dsk-uploader/.git/hooks/post-update.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-applypatch.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-commit.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-merge-commit.sample
/volume2/docker/dsk-uploader/.git/hooks/prepare-commit-msg.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-push.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-rebase.sample
/volume2/docker/dsk-uploader/.git/hooks/pre-receive.sample
/volume2/docker/dsk-uploader/.git/hooks/push-to-checkout.sample
/volume2/docker/dsk-uploader/.git/hooks/update.sample
/volume2/docker/dsk-uploader/.gitignore
/volume2/docker/dsk-uploader/.git/index
/volume2/docker/dsk-uploader/.git/info/exclude
/volume2/docker/dsk-uploader/.git/logs/HEAD
/volume2/docker/dsk-uploader/.git/logs/refs/heads/main
/volume2/docker/dsk-uploader/.git/logs/refs/remotes/origin/HEAD
/volume2/docker/dsk-uploader/.git/logs/refs/remotes/origin/main
/volume2/docker/dsk-uploader/.git/objects/0b/918bed65202bedaa9fa092e539d607be2eea65
/volume2/docker/dsk-uploader/.git/objects/11/b908125d2f0feebf7aca6d24e127f334bce611
/volume2/docker/dsk-uploader/.git/objects/56/a2766ae5422b18e5b1a418fd231ad12fef08e6
/volume2/docker/dsk-uploader/.git/objects/65/386fd3b4ac62094500e21c23845d05b9d18a4f
/volume2/docker/dsk-uploader/.git/objects/7b/2d7b18213f9516ec4544f309772ee4808146bb
/volume2/docker/dsk-uploader/.git/objects/7c/3f071fef98751a68b7d93779f76cf5d5aa8ebf
/volume2/docker/dsk-uploader/.git/objects/85/b5483672f68c327c39ea8c29e94ae8b22b7bbf
/volume2/docker/dsk-uploader/.git/objects/8e/a1cbf78eae8a86c5990d0582db1847c0226b56
/volume2/docker/dsk-uploader/.git/objects/ed/8e93af8cc77c7a85f87a9f37573c51b839e571
/volume2/docker/dsk-uploader/.git/objects/ee/3d5f92e57deec809abda371386e371f32de9bb
/volume2/docker/dsk-uploader/.git/objects/f3/98248da8f4911d463d9a33155fcf58a65092cc
/volume2/docker/dsk-uploader/.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.idx
/volume2/docker/dsk-uploader/.git/objects/pack/pack-ed5aca57f7f3b56e67172d9fb90e685087770006.pack
/volume2/docker/dsk-uploader/.git/ORIG_HEAD
/volume2/docker/dsk-uploader/.git/packed-refs
/volume2/docker/dsk-uploader/.git/refs/heads/main
/volume2/docker/dsk-uploader/.git/refs/remotes/origin/HEAD
/volume2/docker/dsk-uploader/.git/refs/remotes/origin/main
/volume2/docker/dsk-uploader/notion_connector/client.py
/volume2/docker/dsk-uploader/notion_connector/exceptions/exceptions.py
/volume2/docker/dsk-uploader/notion_connector/exceptions/__init__.py
/volume2/docker/dsk-uploader/notion_connector/__init__.py
/volume2/docker/dsk-uploader/notion_connector/resources/blo...
|
11552
|
NULL
|
NULL
|
NULL
|
|
11629
|
520
|
41
|
2026-05-09T06:42:23.209969+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778308943209_m2.jpg...
|
Code
|
Design new payment-logge… — finance [SSH: nas]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: finance [SSH: nas]
Explorer Section: finance [SSH: nas]
FINANCE [SSH: NAS]
auth
dsk-uploader
finance-hub
backend
frontend
.env
.env.example
.gitignore
docker-compose.yml
payments-logger
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
docker-compose.yml, Editor Group 1
.env, Editor Group 1
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
Design new payment-logge…, Editor Group 2
remote SSH: nas
SSH: nas
No Problems
0
0
No Ports Forwarded
0
Notifications
Sign In
Sign In
Info: Setting up SSH Host nas: Setting up SSH tunnel
Design new payment-logger and dsk-uploader hybrid app
Session history
New session
Message actions
payments.js
payments.js
ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.
Thinking
Thinking
I'll explore all three reference projects in parallel to understand their structure before planning.
Agent:
Explore payment-logger app structure and functionality
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How data flows (ingest, storage, retrieval)
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.
Agent:
Explore dsk-uploader app structure and functionality
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How file uploads work - what files, what format, how parsed
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.
Agent:
Explore auth folder and authentik integration
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. What auth system is being used (Authentik)
2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?
3. Middleware - how is auth enforced on routes?
4. Any frontend auth flow - login redirect, token handling, protected routes
5. Environment variables related to auth
6. Docker/deployment setup for the auth service itself
7. Any example of how other apps integrate with this auth
Report with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.
Message actions
payments.js
payments.js
continue
Thinking
Thinking
Launching parallel exploration of all three reference projects.
Agent:
Explore payment-logger app structure
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How data is ingested (look at /ingest route especially)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore dsk-uploader app structure
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How file uploads work (what format, what processing happens)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore auth project structure
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. What authentication system is used (authentik integration details)
3. How OAuth/OIDC flow works
4. Any middleware or helper functions for protecting routes
5. Session management approach
6. How frontend handles auth state
7. Any example of how other apps integrate with this auth system
8. Docker setup and environment variables
Please read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.
Thinking
Thinking
Now I have a complete picture of all three. Let me design the plan.
Agent:
Design combined app architecture
IN
Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:
---
## App 1: payments-logger (Node.js)
- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI
- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS
- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage
- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)
- **Schema** (PostgreSQL via Prisma):
- `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at
- `tags` table: id, name, color — M2M with payments via `_PaymentToTag`
- `users` table: id, username, hashed_password (this will be REMOVED)
- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system
- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance
## App 2: dsk-uploader (Python/Flask)
- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database
- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5
- **Auth**: None (open)
- **CSV format** (DSK Bank Bulgarian format, columns):
- `Дата` (date, DD.MM.YYYY)
- `Вид на трансакцията` (transaction type, Bulgarian)
- `Основание` (reason/description — contains card number regex: `^\d{6}x{6}\d{4}$`)
- `Дебит BGN` (debit amount, may be empty)
- `Кредит BGN` (credit amount, may be empty)
- `Наредител/Получател` (orderer/recipient name)
- `Номер сметка на наредителя / получателя` (account number)
- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers
- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)
## App 3: auth (Authentik)
- **Mode**: Proxy mode via NPM (forward auth)
- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:
- `X-authentik-username`
- `X-authentik-email`
- `X-authentik-groups`
- **No code integration needed** in the app itself — just trust these headers from NPM
- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`
---
## What the New Combined App Must Do
1. **Single PostgreSQL database** for all transactions
2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST
3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema
4. **Unified UI** — show all payments in one table regardless of source
5. **Source indicator** in UI — badge showing "INGEST", "UPLOAD", or "BOTH" (if duplicate detection added)
6. **Source filter** in FilterBar — filter by All/Ingest/Upload
7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM
8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination
9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL
---
## Technical Constraints
- Keep Node.js backend (not Python) — extend payments-logger's stack
- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)
- File upload: use `multer` npm middleware
- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)
- Add `source` enum field (INGEST/UPLOAD) to payments schema
- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is
- Remove `users` table from schema
---
## Please Design
1. Complete folder structure for the new app (suggest name: "finance-hub" or similar — note this is a placeholder, user will confirm)
2. Prisma schema with new fields (`source`, `currency`)
3. All backend API routes
4. CSV parser design in Node.js (port of the Python logic)
5. Authentik auth middleware
6. Frontend component structure (React) — what's reused from payments-logger, what's new
7. Docker Compose setup
8. Environment variables needed
9. Step-by-step implementation order
10. Verification checklist
Be specific about file paths and code structure. This will be used to write actual implementation code.
Thinking
Thinking
Good plan. Let me ask the one thing I need before writing the final plan.
AskUserQuestion
OUT
User has answered your questions: "What should the new combined app be called? This will be the folder name under /volume2/docker/finance/ and the app branding."="finance-hub". You can now continue with the user's answers in mind.
Thinking
Thinking
Writing the final plan now.
Thinking
Thinking
Write
ets-create-a-new-generic-sun.md
ets-create-a-new-generic-sun.md
326 lines
# finance-hub — Implementation Plan
## Context
Two separate finance apps exist as references and will be retired:
- **payments-logger** (Node.js/React): Ingests Bulgarian bank SMS notifications, stores payments in PostgreSQL, provides a review/tag/notify UI.
- **dsk-uploader** (Python/Flask): Uploads DSK bank CSV exports, parses them, sends to Notion.
The new app **finance-hub** (`/volume2/docker/finance/finance-hub/`) replaces both with a single unified system: all transactions (SMS-ingested and CSV-uploaded) land in one PostgreSQL database and one React UI. Authentication is delegated entirely to Authentik (proxy mode via NPM — no custom JWT).
---
## Tech Stack
| Layer | Choice | Rationale |
|-------|--------|-----------|
| Backend | Node.js 20 + Express + Prisma 5 | Extends payments-logger; no Python needed |
| CSV parsing | `csv-parse` + `iconv-lite` | Handles Bulgarian cp1251 encoding, RFC4180 quoted fields |
| File upload | `multer` (memory storage) | Bank CSVs are small (<500 KB), no disk cleanup needed |
| Database | PostgreSQL 16 | Same as payments-logger |
| Frontend | React 18 + Vite + Tailwind CSS + Lucide React | Same as payments-logger |
| Auth | Authentik proxy via NPM headers | No custom JWT; removes users table entirely |
| Container | Docker Compose | Same pattern as both reference apps |
**Removed vs payments-logger:** `bcryptjs`, `jose`, `users` table, login form, JWT storage.
**Removed vs dsk-uploader:** Python/Flask, Pandas, Notion SDK, all Notion references.
**Added:** `csv-parse`, `iconv-lite`, `multer`, `source` + `currency` fields, `UploadPanel` component.
---
## Folder Structure
```
/volume2/docker/finance/finance-hub/
├── docker-compose.yml
├── .env
├── .env.example
├── .gitignore
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ ├── prisma/
│ │ ├── schema.prisma
│ │ └── migrations/
│ │ ├── migration_lock.toml
│ │ └── 20260508_init/
│ │ └── migration.sql
│ └── src/
│ ├── index.js ← entry point (Authentik middleware wired here)
│ ├── auth.js ← Authentik header middleware (replaces JWT auth)
│ ├── parser.js ← SMS parser (copy verbatim from payments-logger)
│ ├── csvParser.js ← NEW: DSK CSV parser (port of Python dskuploader.py)
│ └── routes/
│ ├── payments.js ← existing routes + source/currency additions
│ └── upload.js ← NEW: POST /api/upload/csv
└── frontend/
├── Dockerfile
├── package.json
├── vite.config.js
├── tailwind.config.js
├── postcss.config.js
├── index.html
└── src/
├── main.jsx ← remove AuthProvider wrapper
├── index.css
├── App.jsx ← remove auth state, add Upload tab toggle
└── components/
├── FilterBar.jsx ← add source filter select
├── PaymentTable.jsx ← add Source badge column + currency display
├── PaymentCard.jsx ← minor source badge addition
├── PaymentList.jsx ← unchanged
└── UploadPanel.jsx ← NEW: drag-and-drop CSV upload UI
```
---
## Database Schema (Prisma)
File: `backend/prisma/schema.prisma`
```prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Payment {
id Int @id @default(autoincrement())
rawMessage String @map("raw_message")
date DateTime?
type String?
card String?
recipient String?
amount Float?
currency String? @default("EUR")
balance Float?
source Source @default(INGEST)
status Status @default(UNPROCESSED)
tags Tag[]
notifiedAt DateTime? @map("notified_at")
notifyPhone String? @map("notify_phone")
debitBgn Float? @map("debit_bgn")
creditBgn Float? @map("credit_bgn")
transactionType String? @map("transaction_type")
payerAccount String? @map("payer_account")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("payments")
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
color String @default("#6b7280")
payments Payment[]
@@map("tags")
}
enum Status { UNPROCESSED SENT SKIPPED }
enum Source { INGEST UPLOAD }
```
**Key decisions:**
- No `User` model — Authentik owns identity.
- `currency`: `EUR` for SMS ingest, `BGN` for CSV uploads.
- `debitBgn`, `creditBgn`, `transactionType`, `payerAccount`: nullable CSV-only columns; INGEST rows store nulls. Avoids a union query for the unified list view.
- `balance` is always null for CSV rows (DSK export does not include running balance).
- Fresh consolidated migration — no data migration from reference apps required.
---
## API Routes
| Method | Path | Auth | Description |
|--------|------|------|-------------|
| GET | /api/health | public | Health check |
| POST | /api/payments/ingest | public | SMS or structured ingest (source=INGEST) |
| GET | /api/payments | required | List with filters/sort/pagination (+ source filter) |
| GET | /api/payments/meta/tags | required | All tags |
| GET | /api/payments/meta/filters | required | Filter options incl. `sources` array |
| GET | /api/payments/:id | required | Single payment |
| PATCH | /api/payments/:id | required | Update status |
| DELETE | /api/payments/:id | required | Delete |
| POST | /api/payments/:id/send | required | Send notification |
| POST | /api/payments/:id/skip | required | Skip |
| POST | /api/payments/:id/tags | required | Add/upsert tag |
| DELETE | /api/payments/:id/tags/:tagId | required | Remove tag |
| POST | /api/upload/csv | required | DSK CSV file upload (source=UPLOAD) |
---
## Key Implementation Details
### auth.js (replaces entire old auth module)
```js
const PUBLIC_PATHS = new Set(['/api/health', '/api/payments/ingest']);
function authentikMiddleware(req, res, next) {
if (PUBLIC_PATHS.has(req.path)) return next();
const username = req.headers['x-authentik-username'];
if (!username) return res.status(401).json({ error: 'Unauthorized' });
req.user = {
username,
email: req.headers['x-authentik-email'] || null,
groups: (req.headers['x-authentik-groups'] || '').split(',').map(g => g.trim()).filter(Boolean),
};
next();
}
module.exports = { authentikMiddleware };
```
### csvParser.js (port of dskuploader.py)
- `iconv-lite` decodes buffer as cp1251 (DSK Bank export encoding), falls back to UTF-8
- `csv-parse` parses the decoded text with `columns: true`
- Columns: `Дата`, `Вид на трансакцията`, `Основание`, `Дебит BGN`, `Кредит BGN`, `Наредител/Получател`, `Номер сметка на наредителя / получателя`
- Card extraction: regex `/^\d{6}x{6}\d{4}$/` on first token of `Основание`
- Skips rows where `Вид на трансакцията === 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ'`
- Auto-tags via keyword rules (ЗАПЛАТА→Salary, LIDL→Groceries, NETFLIX→Subscriptions, etc.) — same logic as Python `generate_tags()`
- Returns `{ rows: PaymentData[], skipped: number, errors: string[] }`
### payments.js changes from payments-logger
1. Add `source: 'INGEST'` and `currency` to the `/ingest` create call
2. Add `source` to the `GET /` where clause filter
3. Add `sources` to `meta/filters` response
4. Currency-aware amount formatting in notification message
5. Remove all JWT/auth references (no `/auth/register`, `/auth/login`)
### upload.js (new)
- `multer` memory storage, max 10 files × 10 MB
- Calls `parseDskCsv(buffer)` per file
- Upserts tags via `prisma.tag.upsert` then connects
- Returns `{ imported, skipped, errors, payments[] }`
### Frontend changes
- **Delete**: `auth.js`, `AuthProvider.jsx`
- **main.jsx**: Remove `<AuthProvider>` wrapper
- **App.jsx**: Replace `authFetch` with plain `fetch` (Authentik session cookie travels automatically); logout → `window.location.href = '/outpost.goauthentik.io/sign_out'`; add "Payments" / "Upload CSV" tab toggle
- **FilterBar.jsx**: Add source `<select>` (All / SMS Ingest / CSV Upload); widen grid to 5 cols
- **PaymentTable.jsx**: Add `Source` column with `SMS` (indigo) / `CSV` (emerald) badge; show `${amount} ${currency}` in amount cell
- **UploadPanel.jsx** (new): Drag-and-drop zone + file list + import button + result summary with error accordion; calls `POST /api/upload/csv` with `FormData`
---
## Docker Compose
```yaml
services:
db:
image: postgres:16-alpine
environment: { POSTGRES_USER: finance, POSTGRES_PASSWORD: [PASSWORD] POSTGRES_DB: finance_hub }
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck: { test: pg_isready -U finance -d finance_hub, interval: 5s }
backend:
build: ./backend
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports: ["${BACKEND_PORT:-3001}:3001"]
depends_on: { db: { condition: service_healthy } }
frontend:
build: ./frontend
ports: ["${FRONTEND_PORT:-5175}:5173"]
depends_on: [backend]
volumes: { pgdata: }
```
**NPM setup:** Frontend port proxied through Authentik forward auth. Backend port exposed separately (unprotected) so the public `/api/payments/ingest` remains reachable by iOS Shortcuts / SMS gateways without login.
---
## Environment Variables (.env)
```bash
[ENV_SECRET]
NOTIFIER_URL=https://notifier.lakylak.xyz
NOTIFIER_CHANNEL=viber
NOTIFY_DEFAULT_PHONE=[PHONE]
TZ=Europe/Sofia
BACKEND_PORT=3001
FRONTEND_PORT=5175
```
Removed vs payments-logger: `JWT_SECRET`, `JWT_EXPIRE_MINUTES`.
---
## Implementation Order
1. Create folder structure and write `docker-compose.yml`, `.env.example`, `.gitignore`
2. Write `backend/prisma/schema.prisma` and migration SQL
3. Write `backend/package.json` (add `csv-parse`, `iconv-lite`, `multer`; remove `bcryptjs`, `jose`)
4. Write `backend/Dockerfile`
5. Write `backend/src/auth.js` (Authentik middleware)
6. Copy `backend/src/parser.js` verbatim from payments-logger
7. Write `backend/src/csvParser.js` (Python port)
8. Write `backend/src/routes/upload.js`
9. Write `backend/src/routes/payments.js` (from payments-logger + 5 changes listed above)
10. Write `backend/src/index.js`
11. Copy frontend base from payments-logger; delete `auth.js` + `AuthProvider.jsx`
12. Update `main.jsx`, `App.jsx`, `FilterBar.jsx`, `PaymentTable.jsx`
13. Write `frontend/src/components/UploadPanel.jsx`
14. Update `frontend/vite.config.js`
15. `docker compose build && docker compose up -d`
16. Run verification checklist
---
## Verification
**Schema**
- `payments` table has `source`, `currency`, `debit_bgn`, `credit_bgn`, `transaction_type`, `payer_account`
- No `users` table; `Source` enum exists
**Auth**
- `GET /api/payments` → 401 without `x-authentik-username` header
- `POST /api/payments/ingest` → 201 without any header
- `curl -H "x-authentik-username: test" localhost:3001/api/payments` → 200
**SMS Ingest**
- DSK POS SMS → `source=INGEST`, `currency=EUR`, correct amount/card/recipient
- Apple Wallet structured body → `type=WALLET`, `source=INGEST`
- Rate limiter → 429 after 200 req/min
**CSV Upload**
- Single DSK CSV → rows with `source=UPLOAD`, `currency=BGN`
- Multiple CSVs in one request → all merged
- `ТРАНСФЕР СОБСТВЕНИ СМЕТКИ` rows counted in `skipped`, not imported
- Card regex match from `Основание` column
- Auto-tags applied (ЗАПЛАТА→Salary, LIDL→Groceries)
- cp1251 file imports correctly
**UI**
- Source badge visible in payment table (SMS indigo, CSV emerald)
- Source dropdown in FilterBar filters correctly
- Amount shows correct currency per row
- Upload Panel: drag-and-drop works, result summary shows counts
- Logout redirects to Authentik sign_out
- No login form shown (Authentik handles it at NPM level)
- Tags, send, skip, delete all still work
## Reference Files
- `/volume2/docker/finance/payments-logger/backend/src/routes/payments.js`
- `/volume2/docker/finance/payments-logger/backend/src/parser.js`
- `/volume2/docker/finance/payments-logger/backend/src/index.js`
- `/volume2/docker/finance/payments-logger/backend/src/auth.js`
- `/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma`
- `/volume2/docker/finance/payments-logger/frontend/src/App.jsx`
- `/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx`
- `/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx`
- `/volume2/docker/finance/dsk-uploader/dskuploader.py`
- `/volume2/docker/finance/auth/docker-compose.yml`
Claude’s Plan
ets-create-a-new-generic-sun.md
ets-create-a-new-generic-sun.md
Stayed in plan mode
Thinking
Thinking
Good question. Here's the full breakdown:
Backend Tech Stack — Options
Backend Tech Stack — Options
Option A: Node.js + Express + Prisma (my recommendation)
Option A: Node.js + Express + Prisma (my recommendation)
Why:
payments-logger is already Node.js/Express/Prisma. The new app is 80% payments-logger with CSV upload added on top. Keeping the same stack means:
Copy
parser.js
verbatim, zero rewrite
Copy the entire
routes/payments.js
with minimal edits
Same Prisma schema workflow, same migrations, same Docker image
The CSV parsing logic (the only Python-specific thing) ports cleanly to
csv-parse
— it's just regex + string manipulation, nothing pandas-specific
Trade-off:
Have to port the Python CSV parsing to JS. It's ~150 lines and mostly string manipulation — straightforward.
Option B: Python + FastAPI + SQLAlchemy
Option B: Python + FastAPI + SQLAlchemy
Rewrite everything in Python. dsk-uploader is Python, so CSV parsing is already done.
Pro:
Keep the dsk-uploader CSV logic as-is (no porting). Python has better data science libraries if you later add analytics.
Con:
Lose the entire payments-logger backend (routes, parser, Prisma schema) — full rewrite. FastAPI + SQLAlchemy is a different mental model than Express + Prisma. Frontend stays React anyway, so the stack split doesn't simplify anything.
Verdict:
More work overall, gains almost nothing.
Option C: Hybrid microservices (Node.js backend + Python CSV service)
Option C: Hybrid microservices (Node.js backend + Python CSV service)
Keep Node.js as the main API, add a separate Python FastAPI service just for CSV parsing. They share the DB.
Pro:
Zero porting — Python CSV code used as-is.
Con:
Two backend services to maintain, deploy, and keep in sync. Inter-service HTTP calls. Two Dockerfiles. For ~150 lines of CSV logic, this is massively over-engineered.
Verdict:
Not worth it.
Option D: Python + Flask (exactly like dsk-uploader)
Option D: Python + Flask (exactly like dsk-uploader)
Extend dsk-uploader into a full payments app.
Pro:
Pandas for CSV, no porting.
Con:
Jinja2 templates instead of React (or add React separately). Would need to reimplement the entire payments-logger (SMS parser, notification system, tag management, pagination/filtering). Flask's Jinja templating is far less capable than the existing React UI. The React frontend is the stronger UI foundation.
Verdict:
Worst of all options — rebuild the harder parts (UI, SMS parser, notification) for no gain.
Summary
Summary
Option
CSV porting effort
App rewrite effort
Result quality
A (Node.js)
Medium (150 lines)
Minimal
Best
B (Python FastAPI)
None
High (full backend)
Worse
C (Hybrid)
None
Low + infra overhead
Overkill
D (Python Flask)
None
Very high
Worst
Option
A (Node.js)
B (Python FastAPI)
C (Hybrid)
D (Python Flask)
CSV porting effort
Medium (150 lines)
None
None
None
App rewrite effort
Minimal
High (full backend)
Low + infra overhead
Very high
Result quality
Best
Worse
Overkill
Worst
Option
CSV porting effort
App rewrite effort
Result quality
The CSV parser port (the only cost of Option A) is a one-time ~150 line exercise. Everything else in the plan reuses payments-logger code directly. That's why Node.js is the clear winner here.
Want to adjust the stack, or shall I proceed with Option A?
Message actions
ok sounds good. Implement all you suggested
Thinking
Thinking
Starting implementation. Let me first read all the reference files I'll need to copy from.
Read
parser.js
parser.js
Read
payments.js
payments.js
,
index.js
index.js
Read
App.jsx
App.jsx
Read
FilterBar.jsx
FilterBar.jsx
Read
PaymentTable.jsx
PaymentTable.jsx
Thinking
Thinking
Now let me read the remaining frontend files and the Dockerfile from payments-logger.
Read
main.jsx
main.jsx
Read
index.css
index.css
Read
package.json
package.json
Read
Dockerfile
Dockerfile
Read
Dockerfile
Dockerfile
Read
vite.config.js
vite.config.js
Read
tailwind.config.js
tailwind.config.js
Read
postcss.config.js
postcss.config.js
Thinking
Thinking
Read
index.html
index.html
Read
dskuploader.py
dskuploader.py
Thinking
Thinking
Let me also grab the remaining frontend components.
Read
PaymentCard.jsx
PaymentCard.jsx
Read
PaymentList.jsx
PaymentList.jsx
Read
schema.prisma
schema.prisma
Thinking
Thinking
Good, I have everything I need. Let me set up the todo list and start building.
Thinking
Thinking
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile
Write backend src files (auth, parser, csvParser, index)
Write backend routes (payments.js, upload.js)
Write frontend config files
Write frontend React components
Build and verify with docker compose
Bash
Create finance-hub directory structure
IN
mkdir -p /volume2/docker/finance/finance-hub/backend/src/routes \
/volume2/docker/finance/finance-hub/backend/prisma/migrations/20260508_init \
/volume2/docker/finance/finance-hub/frontend/src/components && echo "done"
Copy code to clipboard
OUT
done
Write
docker-compose.yml
docker-compose.yml
45 lines
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
Write
.env.example
.env.example
15 lines
# Database
[ENV_SECRET]
# Notifier service (for SMS payment notifications)
NOTIFIER_URL=https://notifier.lakylak.xyz
NOTIFIER_CHANNEL=viber
NOTIFY_DEFAULT_PHONE=[PHONE]
# Timezone (used by SMS parser for Bulgarian bank timestamps)
TZ=Europe/Sofia
# Ports (optional — defaults shown)
BACKEND_PORT=3001
FRONTEND_PORT=5175
Write
.gitignore
.gitignore
5 lines
.env
node_modules/
dist/
*.log
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G)","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.2601756,"width":0.0019946808,"height":0.008778931},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.024933511,"top":0.056664005,"width":0.01662234,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Explorer Section: finance [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: finance [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.039228722,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"FINANCE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.039228722,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.07980846,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":17,"bounds":{"left":0.024933511,"top":0.07980846,"width":0.036901597,"height":0.0103751}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"auth","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.008976064,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.096568234,"width":0.0023271276,"height":0.011971269}},{"char_start":1,"char_count":3,"bounds":{"left":0.02825798,"top":0.096568234,"width":0.0066489363,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"dsk-uploader","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.026928192,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.11412609,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":11,"bounds":{"left":0.028590426,"top":0.11412609,"width":0.024268618,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"finance-hub","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.024268618,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.13168396,"width":0.0016622341,"height":0.011971269}},{"char_start":1,"char_count":10,"bounds":{"left":0.027593086,"top":0.13168396,"width":0.022938829,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.14844373,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":27,"bounds":{"left":0.028590426,"top":0.14844373,"width":0.017287234,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.14924182,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":6,"bounds":{"left":0.03125,"top":0.14924182,"width":0.01462766,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.1660016,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"frontend","depth":27,"bounds":{"left":0.028590426,"top":0.1660016,"width":0.017287234,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.16679968,"width":0.0016622341,"height":0.011971269}},{"char_start":1,"char_count":7,"bounds":{"left":0.03025266,"top":0.16679968,"width":0.015625,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"bounds":{"left":0.028590426,"top":0.18355946,"width":0.00831117,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.18435754,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":3,"bounds":{"left":0.029920213,"top":0.18435754,"width":0.006981383,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.19952115,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env.example","depth":27,"bounds":{"left":0.028590426,"top":0.20111732,"width":0.025930852,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.2019154,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":11,"bounds":{"left":0.029920213,"top":0.2019154,"width":0.024933511,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.21707901,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.028590426,"top":0.21867518,"width":0.018949468,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.21947326,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":9,"bounds":{"left":0.029920213,"top":0.21947326,"width":0.017952127,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"bounds":{"left":0.028590426,"top":0.23623304,"width":0.042220745,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.23703113,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":17,"bounds":{"left":0.03125,"top":0.23703113,"width":0.03956117,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.25379092,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"payments-logger","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.034574468,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.254589,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":14,"bounds":{"left":0.028590426,"top":0.254589,"width":0.031914894,"height":0.011971269}}],"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.0029920214,"height":0.0103751}},{"char_start":1,"char_count":6,"bounds":{"left":0.025598405,"top":0.95131683,"width":0.013630319,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.0026595744,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.025265958,"top":0.9688747,"width":0.015292553,"height":0.0103751}}],"role_description":"text"},{"role":"AXRadioButton","text":"docker-compose.yml, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.0625,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":".env, Editor Group 1","depth":28,"bounds":{"left":0.17785904,"top":0.047885075,"width":0.040226065,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.14527926,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","depth":28,"bounds":{"left":0.13763298,"top":0.26097366,"width":0.18018617,"height":0.014365523},"on_screen":true,"value":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","depth":29,"bounds":{"left":0.13763298,"top":0.26097366,"width":0.18018617,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Design new payment-logge…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.07912234,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.03025266,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.041888297,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.04720745,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.054521278,"top":0.98244214,"width":0.012632979,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.05618351,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.061502658,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sign In","depth":16,"bounds":{"left":0.9650931,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.96675533,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sign In","depth":17,"bounds":{"left":0.97207445,"top":0.9856345,"width":0.013962766,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Info: Setting up SSH Host nas: Setting up SSH tunnel","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Design new payment-logger and dsk-uploader hybrid app","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.97839093,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9890292,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"payments.js","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"I'll explore all three reference projects in parallel to understand their structure before planning.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore payment-logger app structure and functionality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:\n1. Tech stack (frontend framework, backend framework, database)\n2. What the app does - its core purpose and features\n3. Database schema - all tables, relationships\n4. API routes - all endpoints, their purpose and request/response shapes\n5. How data flows (ingest, storage, retrieval)\n6. Any auth/middleware setup\n7. Docker/deployment setup\n8. Key files and their roles\n\nReport with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore dsk-uploader app structure and functionality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:\n1. Tech stack (frontend framework, backend framework, database)\n2. What the app does - its core purpose and features\n3. Database schema - all tables, relationships\n4. API routes - all endpoints, their purpose and request/response shapes\n5. How file uploads work - what files, what format, how parsed\n6. Any auth/middleware setup\n7. Docker/deployment setup\n8. Key files and their roles\n\nReport with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore auth folder and authentik integration","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:\n1. What auth system is being used (Authentik)\n2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?\n3. Middleware - how is auth enforced on routes?\n4. Any frontend auth flow - login redirect, token handling, protected routes\n5. Environment variables related to auth\n6. Docker/deployment setup for the auth service itself\n7. Any example of how other apps integrate with this auth\n\nReport with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"payments.js","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"continue","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Launching parallel exploration of all three reference projects.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore payment-logger app structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. Tech stack (frontend framework, backend framework, database, etc.)\n3. What the app does - its core functionality\n4. How data is ingested (look at /ingest route especially)\n5. Database schema (what tables/collections exist)\n6. API routes and their purposes\n7. Frontend pages and components\n8. Docker setup\n9. Any auth/session handling\n\nPlease read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore dsk-uploader app structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. Tech stack (frontend framework, backend framework, database, etc.)\n3. What the app does - its core functionality\n4. How file uploads work (what format, what processing happens)\n5. Database schema (what tables/collections exist)\n6. API routes and their purposes\n7. Frontend pages and components\n8. Docker setup\n9. Any auth/session handling\n\nPlease read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore auth project structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. What authentication system is used (authentik integration details)\n3. How OAuth/OIDC flow works\n4. Any middleware or helper functions for protecting routes\n5. Session management approach\n6. How frontend handles auth state\n7. Any example of how other apps integrate with this auth system\n8. Docker setup and environment variables\n\nPlease read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now I have a complete picture of all three. Let me design the plan.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Design combined app architecture","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:\n\n---\n\n## App 1: payments-logger (Node.js)\n- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI\n- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS\n- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage\n- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)\n- **Schema** (PostgreSQL via Prisma):\n - `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at\n - `tags` table: id, name, color — M2M with payments via `_PaymentToTag`\n - `users` table: id, username, hashed_password (this will be REMOVED)\n- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system\n- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance\n\n## App 2: dsk-uploader (Python/Flask)\n- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database\n- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5\n- **Auth**: None (open)\n- **CSV format** (DSK Bank Bulgarian format, columns):\n - `Дата` (date, DD.MM.YYYY)\n - `Вид на трансакцията` (transaction type, Bulgarian)\n - `Основание` (reason/description — contains card number regex: `^\\d{6}x{6}\\d{4}$`)\n - `Дебит BGN` (debit amount, may be empty)\n - `Кредит BGN` (credit amount, may be empty)\n - `Наредител/Получател` (orderer/recipient name)\n - `Номер сметка на наредителя / получателя` (account number)\n- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers\n- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)\n\n## App 3: auth (Authentik)\n- **Mode**: Proxy mode via NPM (forward auth)\n- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:\n - `X-authentik-username` \n - `X-authentik-email`\n - `X-authentik-groups`\n- **No code integration needed** in the app itself — just trust these headers from NPM\n- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`\n\n---\n\n## What the New Combined App Must Do\n\n1. **Single PostgreSQL database** for all transactions\n2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST\n3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema\n4. **Unified UI** — show all payments in one table regardless of source\n5. **Source indicator** in UI — badge showing \"INGEST\", \"UPLOAD\", or \"BOTH\" (if duplicate detection added)\n6. **Source filter** in FilterBar — filter by All/Ingest/Upload\n7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM\n8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination\n9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL\n\n---\n\n## Technical Constraints\n\n- Keep Node.js backend (not Python) — extend payments-logger's stack\n- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)\n- File upload: use `multer` npm middleware\n- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)\n- Add `source` enum field (INGEST/UPLOAD) to payments schema\n- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is\n- Remove `users` table from schema\n\n---\n\n## Please Design\n\n1. Complete folder structure for the new app (suggest name: \"finance-hub\" or similar — note this is a placeholder, user will confirm)\n2. Prisma schema with new fields (`source`, `currency`)\n3. All backend API routes\n4. CSV parser design in Node.js (port of the Python logic)\n5. Authentik auth middleware\n6. Frontend component structure (React) — what's reused from payments-logger, what's new\n7. Docker Compose setup\n8. Environment variables needed\n9. Step-by-step implementation order\n10. Verification checklist\n\nBe specific about file paths and code structure. This will be used to write actual implementation code.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good plan. Let me ask the one thing I need before writing the final plan.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskUserQuestion","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"User has answered your questions: \"What should the new combined app be called? This will be the folder name under /volume2/docker/finance/ and the app branding.\"=\"finance-hub\". You can now continue with the user's answers in mind.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Writing the final plan now.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"ets-create-a-new-generic-sun.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ets-create-a-new-generic-sun.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"326 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"# finance-hub — Implementation Plan\n\n## Context\n\nTwo separate finance apps exist as references and will be retired:\n- **payments-logger** (Node.js/React): Ingests Bulgarian bank SMS notifications, stores payments in PostgreSQL, provides a review/tag/notify UI.\n- **dsk-uploader** (Python/Flask): Uploads DSK bank CSV exports, parses them, sends to Notion.\n\nThe new app **finance-hub** (`/volume2/docker/finance/finance-hub/`) replaces both with a single unified system: all transactions (SMS-ingested and CSV-uploaded) land in one PostgreSQL database and one React UI. Authentication is delegated entirely to Authentik (proxy mode via NPM — no custom JWT).\n\n---\n\n## Tech Stack\n\n| Layer | Choice | Rationale |\n|-------|--------|-----------|\n| Backend | Node.js 20 + Express + Prisma 5 | Extends payments-logger; no Python needed |\n| CSV parsing | `csv-parse` + `iconv-lite` | Handles Bulgarian cp1251 encoding, RFC4180 quoted fields |\n| File upload | `multer` (memory storage) | Bank CSVs are small (<500 KB), no disk cleanup needed |\n| Database | PostgreSQL 16 | Same as payments-logger |\n| Frontend | React 18 + Vite + Tailwind CSS + Lucide React | Same as payments-logger |\n| Auth | Authentik proxy via NPM headers | No custom JWT; removes users table entirely |\n| Container | Docker Compose | Same pattern as both reference apps |\n\n**Removed vs payments-logger:** `bcryptjs`, `jose`, `users` table, login form, JWT storage. \n**Removed vs dsk-uploader:** Python/Flask, Pandas, Notion SDK, all Notion references. \n**Added:** `csv-parse`, `iconv-lite`, `multer`, `source` + `currency` fields, `UploadPanel` component.\n\n---\n\n## Folder Structure\n\n```\n/volume2/docker/finance/finance-hub/\n├── docker-compose.yml\n├── .env\n├── .env.example\n├── .gitignore\n├── backend/\n│ ├── Dockerfile\n│ ├── package.json\n│ ├── prisma/\n│ │ ├── schema.prisma\n│ │ └── migrations/\n│ │ ├── migration_lock.toml\n│ │ └── 20260508_init/\n│ │ └── migration.sql\n│ └── src/\n│ ├── index.js ← entry point (Authentik middleware wired here)\n│ ├── auth.js ← Authentik header middleware (replaces JWT auth)\n│ ├── parser.js ← SMS parser (copy verbatim from payments-logger)\n│ ├── csvParser.js ← NEW: DSK CSV parser (port of Python dskuploader.py)\n│ └── routes/\n│ ├── payments.js ← existing routes + source/currency additions\n│ └── upload.js ← NEW: POST /api/upload/csv\n└── frontend/\n ├── Dockerfile\n ├── package.json\n ├── vite.config.js\n ├── tailwind.config.js\n ├── postcss.config.js\n ├── index.html\n └── src/\n ├── main.jsx ← remove AuthProvider wrapper\n ├── index.css\n ├── App.jsx ← remove auth state, add Upload tab toggle\n └── components/\n ├── FilterBar.jsx ← add source filter select\n ├── PaymentTable.jsx ← add Source badge column + currency display\n ├── PaymentCard.jsx ← minor source badge addition\n ├── PaymentList.jsx ← unchanged\n └── UploadPanel.jsx ← NEW: drag-and-drop CSV upload UI\n```\n\n---\n\n## Database Schema (Prisma)\n\nFile: `backend/prisma/schema.prisma`\n\n```prisma\ngenerator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Payment {\n id Int @id @default(autoincrement())\n rawMessage String @map(\"raw_message\")\n date DateTime?\n type String?\n card String?\n recipient String?\n amount Float?\n currency String? @default(\"EUR\")\n balance Float?\n source Source @default(INGEST)\n status Status @default(UNPROCESSED)\n tags Tag[]\n notifiedAt DateTime? @map(\"notified_at\")\n notifyPhone String? @map(\"notify_phone\")\n debitBgn Float? @map(\"debit_bgn\")\n creditBgn Float? @map(\"credit_bgn\")\n transactionType String? @map(\"transaction_type\")\n payerAccount String? @map(\"payer_account\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@map(\"payments\")\n}\n\nmodel Tag {\n id Int @id @default(autoincrement())\n name String @unique\n color String @default(\"#6b7280\")\n payments Payment[]\n\n @@map(\"tags\")\n}\n\nenum Status { UNPROCESSED SENT SKIPPED }\nenum Source { INGEST UPLOAD }\n```\n\n**Key decisions:**\n- No `User` model — Authentik owns identity.\n- `currency`: `EUR` for SMS ingest, `BGN` for CSV uploads.\n- `debitBgn`, `creditBgn`, `transactionType`, `payerAccount`: nullable CSV-only columns; INGEST rows store nulls. Avoids a union query for the unified list view.\n- `balance` is always null for CSV rows (DSK export does not include running balance).\n- Fresh consolidated migration — no data migration from reference apps required.\n\n---\n\n## API Routes\n\n| Method | Path | Auth | Description |\n|--------|------|------|-------------|\n| GET | /api/health | public | Health check |\n| POST | /api/payments/ingest | public | SMS or structured ingest (source=INGEST) |\n| GET | /api/payments | required | List with filters/sort/pagination (+ source filter) |\n| GET | /api/payments/meta/tags | required | All tags |\n| GET | /api/payments/meta/filters | required | Filter options incl. `sources` array |\n| GET | /api/payments/:id | required | Single payment |\n| PATCH | /api/payments/:id | required | Update status |\n| DELETE | /api/payments/:id | required | Delete |\n| POST | /api/payments/:id/send | required | Send notification |\n| POST | /api/payments/:id/skip | required | Skip |\n| POST | /api/payments/:id/tags | required | Add/upsert tag |\n| DELETE | /api/payments/:id/tags/:tagId | required | Remove tag |\n| POST | /api/upload/csv | required | DSK CSV file upload (source=UPLOAD) |\n\n---\n\n## Key Implementation Details\n\n### auth.js (replaces entire old auth module)\n```js\nconst PUBLIC_PATHS = new Set(['/api/health', '/api/payments/ingest']);\n\nfunction authentikMiddleware(req, res, next) {\n if (PUBLIC_PATHS.has(req.path)) return next();\n const username = req.headers['x-authentik-username'];\n if (!username) return res.status(401).json({ error: 'Unauthorized' });\n req.user = {\n username,\n email: req.headers['x-authentik-email'] || null,\n groups: (req.headers['x-authentik-groups'] || '').split(',').map(g => g.trim()).filter(Boolean),\n };\n next();\n}\nmodule.exports = { authentikMiddleware };\n```\n\n### csvParser.js (port of dskuploader.py)\n- `iconv-lite` decodes buffer as cp1251 (DSK Bank export encoding), falls back to UTF-8\n- `csv-parse` parses the decoded text with `columns: true`\n- Columns: `Дата`, `Вид на трансакцията`, `Основание`, `Дебит BGN`, `Кредит BGN`, `Наредител/Получател`, `Номер сметка на наредителя / получателя`\n- Card extraction: regex `/^\\d{6}x{6}\\d{4}$/` on first token of `Основание`\n- Skips rows where `Вид на трансакцията === 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ'`\n- Auto-tags via keyword rules (ЗАПЛАТА→Salary, LIDL→Groceries, NETFLIX→Subscriptions, etc.) — same logic as Python `generate_tags()`\n- Returns `{ rows: PaymentData[], skipped: number, errors: string[] }`\n\n### payments.js changes from payments-logger\n1. Add `source: 'INGEST'` and `currency` to the `/ingest` create call\n2. Add `source` to the `GET /` where clause filter\n3. Add `sources` to `meta/filters` response\n4. Currency-aware amount formatting in notification message\n5. Remove all JWT/auth references (no `/auth/register`, `/auth/login`)\n\n### upload.js (new)\n- `multer` memory storage, max 10 files × 10 MB\n- Calls `parseDskCsv(buffer)` per file\n- Upserts tags via `prisma.tag.upsert` then connects\n- Returns `{ imported, skipped, errors, payments[] }`\n\n### Frontend changes\n- **Delete**: `auth.js`, `AuthProvider.jsx`\n- **main.jsx**: Remove `<AuthProvider>` wrapper\n- **App.jsx**: Replace `authFetch` with plain `fetch` (Authentik session cookie travels automatically); logout → `window.location.href = '/outpost.goauthentik.io/sign_out'`; add \"Payments\" / \"Upload CSV\" tab toggle\n- **FilterBar.jsx**: Add source `<select>` (All / SMS Ingest / CSV Upload); widen grid to 5 cols\n- **PaymentTable.jsx**: Add `Source` column with `SMS` (indigo) / `CSV` (emerald) badge; show `${amount} ${currency}` in amount cell\n- **UploadPanel.jsx** (new): Drag-and-drop zone + file list + import button + result summary with error accordion; calls `POST /api/upload/csv` with `FormData`\n\n---\n\n## Docker Compose\n\n```yaml\nservices:\n db:\n image: postgres:16-alpine\n environment: { POSTGRES_USER: finance, POSTGRES_PASSWORD: ${DB_PASSWORD}, POSTGRES_DB: finance_hub }\n volumes: [pgdata:/var/lib/postgresql/data]\n healthcheck: { test: pg_isready -U finance -d finance_hub, interval: 5s }\n\n backend:\n build: ./backend\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports: [\"${BACKEND_PORT:-3001}:3001\"]\n depends_on: { db: { condition: service_healthy } }\n\n frontend:\n build: ./frontend\n ports: [\"${FRONTEND_PORT:-5175}:5173\"]\n depends_on: [backend]\n\nvolumes: { pgdata: }\n```\n\n**NPM setup:** Frontend port proxied through Authentik forward auth. Backend port exposed separately (unprotected) so the public `/api/payments/ingest` remains reachable by iOS Shortcuts / SMS gateways without login.\n\n---\n\n## Environment Variables (.env)\n\n```bash\nDB_PASSWORD=change_me\nNOTIFIER_URL=https://notifier.lakylak.xyz\nNOTIFIER_CHANNEL=viber\nNOTIFY_DEFAULT_PHONE=+359000000000\nTZ=Europe/Sofia\nBACKEND_PORT=3001\nFRONTEND_PORT=5175\n```\n\nRemoved vs payments-logger: `JWT_SECRET`, `JWT_EXPIRE_MINUTES`.\n\n---\n\n## Implementation Order\n\n1. Create folder structure and write `docker-compose.yml`, `.env.example`, `.gitignore`\n2. Write `backend/prisma/schema.prisma` and migration SQL\n3. Write `backend/package.json` (add `csv-parse`, `iconv-lite`, `multer`; remove `bcryptjs`, `jose`)\n4. Write `backend/Dockerfile`\n5. Write `backend/src/auth.js` (Authentik middleware)\n6. Copy `backend/src/parser.js` verbatim from payments-logger\n7. Write `backend/src/csvParser.js` (Python port)\n8. Write `backend/src/routes/upload.js`\n9. Write `backend/src/routes/payments.js` (from payments-logger + 5 changes listed above)\n10. Write `backend/src/index.js`\n11. Copy frontend base from payments-logger; delete `auth.js` + `AuthProvider.jsx`\n12. Update `main.jsx`, `App.jsx`, `FilterBar.jsx`, `PaymentTable.jsx`\n13. Write `frontend/src/components/UploadPanel.jsx`\n14. Update `frontend/vite.config.js`\n15. `docker compose build && docker compose up -d`\n16. Run verification checklist\n\n---\n\n## Verification\n\n**Schema**\n- `payments` table has `source`, `currency`, `debit_bgn`, `credit_bgn`, `transaction_type`, `payer_account`\n- No `users` table; `Source` enum exists\n\n**Auth**\n- `GET /api/payments` → 401 without `x-authentik-username` header\n- `POST /api/payments/ingest` → 201 without any header\n- `curl -H \"x-authentik-username: test\" localhost:3001/api/payments` → 200\n\n**SMS Ingest**\n- DSK POS SMS → `source=INGEST`, `currency=EUR`, correct amount/card/recipient\n- Apple Wallet structured body → `type=WALLET`, `source=INGEST`\n- Rate limiter → 429 after 200 req/min\n\n**CSV Upload**\n- Single DSK CSV → rows with `source=UPLOAD`, `currency=BGN`\n- Multiple CSVs in one request → all merged\n- `ТРАНСФЕР СОБСТВЕНИ СМЕТКИ` rows counted in `skipped`, not imported\n- Card regex match from `Основание` column\n- Auto-tags applied (ЗАПЛАТА→Salary, LIDL→Groceries)\n- cp1251 file imports correctly\n\n**UI**\n- Source badge visible in payment table (SMS indigo, CSV emerald)\n- Source dropdown in FilterBar filters correctly\n- Amount shows correct currency per row\n- Upload Panel: drag-and-drop works, result summary shows counts\n- Logout redirects to Authentik sign_out\n- No login form shown (Authentik handles it at NPM level)\n- Tags, send, skip, delete all still work\n\n## Reference Files\n\n- `/volume2/docker/finance/payments-logger/backend/src/routes/payments.js`\n- `/volume2/docker/finance/payments-logger/backend/src/parser.js`\n- `/volume2/docker/finance/payments-logger/backend/src/index.js`\n- `/volume2/docker/finance/payments-logger/backend/src/auth.js`\n- `/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma`\n- `/volume2/docker/finance/payments-logger/frontend/src/App.jsx`\n- `/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx`\n- `/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx`\n- `/volume2/docker/finance/dsk-uploader/dskuploader.py`\n- `/volume2/docker/finance/auth/docker-compose.yml`","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Claude’s Plan","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"ets-create-a-new-generic-sun.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ets-create-a-new-generic-sun.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Stayed in plan mode","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good question. Here's the full breakdown:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Backend Tech Stack — Options","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Backend Tech Stack — Options","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option A: Node.js + Express + Prisma (my recommendation)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option A: Node.js + Express + Prisma (my recommendation)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Why:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"payments-logger is already Node.js/Express/Prisma. The new app is 80% payments-logger with CSV upload added on top. Keeping the same stack means:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Copy","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"verbatim, zero rewrite","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Copy the entire","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"routes/payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"with minimal edits","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Same Prisma schema workflow, same migrations, same Docker image","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The CSV parsing logic (the only Python-specific thing) ports cleanly to","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"csv-parse","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— it's just regex + string manipulation, nothing pandas-specific","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Trade-off:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Have to port the Python CSV parsing to JS. It's ~150 lines and mostly string manipulation — straightforward.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option B: Python + FastAPI + SQLAlchemy","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option B: Python + FastAPI + SQLAlchemy","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Rewrite everything in Python. dsk-uploader is Python, so CSV parsing is already done.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pro:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Keep the dsk-uploader CSV logic as-is (no porting). Python has better data science libraries if you later add analytics.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Con:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Lose the entire payments-logger backend (routes, parser, Prisma schema) — full rewrite. FastAPI + SQLAlchemy is a different mental model than Express + Prisma. Frontend stays React anyway, so the stack split doesn't simplify anything.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Verdict:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"More work overall, gains almost nothing.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option C: Hybrid microservices (Node.js backend + Python CSV service)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option C: Hybrid microservices (Node.js backend + Python CSV service)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Keep Node.js as the main API, add a separate Python FastAPI service just for CSV parsing. They share the DB.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pro:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Zero porting — Python CSV code used as-is.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Con:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Two backend services to maintain, deploy, and keep in sync. Inter-service HTTP calls. Two Dockerfiles. For ~150 lines of CSV logic, this is massively over-engineered.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Verdict:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Not worth it.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option D: Python + Flask (exactly like dsk-uploader)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option D: Python + Flask (exactly like dsk-uploader)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Extend dsk-uploader into a full payments app.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pro:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pandas for CSV, no porting.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Con:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Jinja2 templates instead of React (or add React separately). Would need to reimplement the entire payments-logger (SMS parser, notification system, tag management, pagination/filtering). Flask's Jinja templating is far less capable than the existing React UI. The React frontend is the stronger UI foundation.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Verdict:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worst of all options — rebuild the harder parts (UI, SMS parser, notification) for no gain.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Summary","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Summary","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Option","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CSV porting effort","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"App rewrite effort","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Result quality","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"A (Node.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Medium (150 lines)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Minimal","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Best","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"B (Python FastAPI)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"High (full backend)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worse","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"C (Hybrid)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Low + infra overhead","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Overkill","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"D (Python Flask)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Very high","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worst","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Option","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"A (Node.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"B (Python FastAPI)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"C (Hybrid)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"D (Python Flask)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CSV porting effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Medium (150 lines)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"App rewrite effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Minimal","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"High (full backend)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Low + infra overhead","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Very high","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Result quality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Best","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worse","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Overkill","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worst","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Option","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CSV porting effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"App rewrite effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Result quality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The CSV parser port (the only cost of Option A) is a one-time ~150 line exercise. Everything else in the plan reuses payments-logger code directly. That's why Node.js is the clear winner here.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Want to adjust the stack, or shall I proceed with Option A?","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ok sounds good. Implement all you suggested","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Starting implementation. Let me first read all the reference files I'll need to copy from.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"parser.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"payments.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"App.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"App.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"FilterBar.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"FilterBar.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentTable.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentTable.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now let me read the remaining frontend files and the Dockerfile from payments-logger.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"main.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.css","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.css","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"vite.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"vite.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"tailwind.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"tailwind.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"postcss.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"postcss.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"dskuploader.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"dskuploader.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Let me also grab the remaining frontend components.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentCard.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentCard.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentList.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentList.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"schema.prisma","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"schema.prisma","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good, I have everything I need. Let me set up the todo list and start building.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create finance-hub directory structure","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"mkdir -p /volume2/docker/finance/finance-hub/backend/src/routes \\\n /volume2/docker/finance/finance-hub/backend/prisma/migrations/20260508_init \\\n /volume2/docker/finance/finance-hub/frontend/src/components && echo \"done\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"done","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"45 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"15 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"# Database\nDB_PASSWORD=change_me_strong_password\n\n# Notifier service (for SMS payment notifications)\nNOTIFIER_URL=https://notifier.lakylak.xyz\nNOTIFIER_CHANNEL=viber\nNOTIFY_DEFAULT_PHONE=+359000000000\n\n# Timezone (used by SMS parser for Bulgarian bank timestamps)\nTZ=Europe/Sofia\n\n# Ports (optional — defaults shown)\nBACKEND_PORT=3001\nFRONTEND_PORT=5175","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".gitignore","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".gitignore","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"5 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".env\nnode_modules/\ndist/\n*.log","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"}]...
|
-6754600402406284535
|
2053099664997411807
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: finance [SSH: nas]
Explorer Section: finance [SSH: nas]
FINANCE [SSH: NAS]
auth
dsk-uploader
finance-hub
backend
frontend
.env
.env.example
.gitignore
docker-compose.yml
payments-logger
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
docker-compose.yml, Editor Group 1
.env, Editor Group 1
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
Design new payment-logge…, Editor Group 2
remote SSH: nas
SSH: nas
No Problems
0
0
No Ports Forwarded
0
Notifications
Sign In
Sign In
Info: Setting up SSH Host nas: Setting up SSH tunnel
Design new payment-logger and dsk-uploader hybrid app
Session history
New session
Message actions
payments.js
payments.js
ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.
Thinking
Thinking
I'll explore all three reference projects in parallel to understand their structure before planning.
Agent:
Explore payment-logger app structure and functionality
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How data flows (ingest, storage, retrieval)
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.
Agent:
Explore dsk-uploader app structure and functionality
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How file uploads work - what files, what format, how parsed
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.
Agent:
Explore auth folder and authentik integration
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. What auth system is being used (Authentik)
2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?
3. Middleware - how is auth enforced on routes?
4. Any frontend auth flow - login redirect, token handling, protected routes
5. Environment variables related to auth
6. Docker/deployment setup for the auth service itself
7. Any example of how other apps integrate with this auth
Report with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.
Message actions
payments.js
payments.js
continue
Thinking
Thinking
Launching parallel exploration of all three reference projects.
Agent:
Explore payment-logger app structure
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How data is ingested (look at /ingest route especially)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore dsk-uploader app structure
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How file uploads work (what format, what processing happens)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore auth project structure
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. What authentication system is used (authentik integration details)
3. How OAuth/OIDC flow works
4. Any middleware or helper functions for protecting routes
5. Session management approach
6. How frontend handles auth state
7. Any example of how other apps integrate with this auth system
8. Docker setup and environment variables
Please read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.
Thinking
Thinking
Now I have a complete picture of all three. Let me design the plan.
Agent:
Design combined app architecture
IN
Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:
---
## App 1: payments-logger (Node.js)
- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI
- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS
- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage
- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)
- **Schema** (PostgreSQL via Prisma):
- `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at
- `tags` table: id, name, color — M2M with payments via `_PaymentToTag`
- `users` table: id, username, hashed_password (this will be REMOVED)
- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system
- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance
## App 2: dsk-uploader (Python/Flask)
- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database
- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5
- **Auth**: None (open)
- **CSV format** (DSK Bank Bulgarian format, columns):
- `Дата` (date, DD.MM.YYYY)
- `Вид на трансакцията` (transaction type, Bulgarian)
- `Основание` (reason/description — contains card number regex: `^\d{6}x{6}\d{4}$`)
- `Дебит BGN` (debit amount, may be empty)
- `Кредит BGN` (credit amount, may be empty)
- `Наредител/Получател` (orderer/recipient name)
- `Номер сметка на наредителя / получателя` (account number)
- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers
- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)
## App 3: auth (Authentik)
- **Mode**: Proxy mode via NPM (forward auth)
- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:
- `X-authentik-username`
- `X-authentik-email`
- `X-authentik-groups`
- **No code integration needed** in the app itself — just trust these headers from NPM
- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`
---
## What the New Combined App Must Do
1. **Single PostgreSQL database** for all transactions
2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST
3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema
4. **Unified UI** — show all payments in one table regardless of source
5. **Source indicator** in UI — badge showing "INGEST", "UPLOAD", or "BOTH" (if duplicate detection added)
6. **Source filter** in FilterBar — filter by All/Ingest/Upload
7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM
8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination
9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL
---
## Technical Constraints
- Keep Node.js backend (not Python) — extend payments-logger's stack
- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)
- File upload: use `multer` npm middleware
- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)
- Add `source` enum field (INGEST/UPLOAD) to payments schema
- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is
- Remove `users` table from schema
---
## Please Design
1. Complete folder structure for the new app (suggest name: "finance-hub" or similar — note this is a placeholder, user will confirm)
2. Prisma schema with new fields (`source`, `currency`)
3. All backend API routes
4. CSV parser design in Node.js (port of the Python logic)
5. Authentik auth middleware
6. Frontend component structure (React) — what's reused from payments-logger, what's new
7. Docker Compose setup
8. Environment variables needed
9. Step-by-step implementation order
10. Verification checklist
Be specific about file paths and code structure. This will be used to write actual implementation code.
Thinking
Thinking
Good plan. Let me ask the one thing I need before writing the final plan.
AskUserQuestion
OUT
User has answered your questions: "What should the new combined app be called? This will be the folder name under /volume2/docker/finance/ and the app branding."="finance-hub". You can now continue with the user's answers in mind.
Thinking
Thinking
Writing the final plan now.
Thinking
Thinking
Write
ets-create-a-new-generic-sun.md
ets-create-a-new-generic-sun.md
326 lines
# finance-hub — Implementation Plan
## Context
Two separate finance apps exist as references and will be retired:
- **payments-logger** (Node.js/React): Ingests Bulgarian bank SMS notifications, stores payments in PostgreSQL, provides a review/tag/notify UI.
- **dsk-uploader** (Python/Flask): Uploads DSK bank CSV exports, parses them, sends to Notion.
The new app **finance-hub** (`/volume2/docker/finance/finance-hub/`) replaces both with a single unified system: all transactions (SMS-ingested and CSV-uploaded) land in one PostgreSQL database and one React UI. Authentication is delegated entirely to Authentik (proxy mode via NPM — no custom JWT).
---
## Tech Stack
| Layer | Choice | Rationale |
|-------|--------|-----------|
| Backend | Node.js 20 + Express + Prisma 5 | Extends payments-logger; no Python needed |
| CSV parsing | `csv-parse` + `iconv-lite` | Handles Bulgarian cp1251 encoding, RFC4180 quoted fields |
| File upload | `multer` (memory storage) | Bank CSVs are small (<500 KB), no disk cleanup needed |
| Database | PostgreSQL 16 | Same as payments-logger |
| Frontend | React 18 + Vite + Tailwind CSS + Lucide React | Same as payments-logger |
| Auth | Authentik proxy via NPM headers | No custom JWT; removes users table entirely |
| Container | Docker Compose | Same pattern as both reference apps |
**Removed vs payments-logger:** `bcryptjs`, `jose`, `users` table, login form, JWT storage.
**Removed vs dsk-uploader:** Python/Flask, Pandas, Notion SDK, all Notion references.
**Added:** `csv-parse`, `iconv-lite`, `multer`, `source` + `currency` fields, `UploadPanel` component.
---
## Folder Structure
```
/volume2/docker/finance/finance-hub/
├── docker-compose.yml
├── .env
├── .env.example
├── .gitignore
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ ├── prisma/
│ │ ├── schema.prisma
│ │ └── migrations/
│ │ ├── migration_lock.toml
│ │ └── 20260508_init/
│ │ └── migration.sql
│ └── src/
│ ├── index.js ← entry point (Authentik middleware wired here)
│ ├── auth.js ← Authentik header middleware (replaces JWT auth)
│ ├── parser.js ← SMS parser (copy verbatim from payments-logger)
│ ├── csvParser.js ← NEW: DSK CSV parser (port of Python dskuploader.py)
│ └── routes/
│ ├── payments.js ← existing routes + source/currency additions
│ └── upload.js ← NEW: POST /api/upload/csv
└── frontend/
├── Dockerfile
├── package.json
├── vite.config.js
├── tailwind.config.js
├── postcss.config.js
├── index.html
└── src/
├── main.jsx ← remove AuthProvider wrapper
├── index.css
├── App.jsx ← remove auth state, add Upload tab toggle
└── components/
├── FilterBar.jsx ← add source filter select
├── PaymentTable.jsx ← add Source badge column + currency display
├── PaymentCard.jsx ← minor source badge addition
├── PaymentList.jsx ← unchanged
└── UploadPanel.jsx ← NEW: drag-and-drop CSV upload UI
```
---
## Database Schema (Prisma)
File: `backend/prisma/schema.prisma`
```prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Payment {
id Int @id @default(autoincrement())
rawMessage String @map("raw_message")
date DateTime?
type String?
card String?
recipient String?
amount Float?
currency String? @default("EUR")
balance Float?
source Source @default(INGEST)
status Status @default(UNPROCESSED)
tags Tag[]
notifiedAt DateTime? @map("notified_at")
notifyPhone String? @map("notify_phone")
debitBgn Float? @map("debit_bgn")
creditBgn Float? @map("credit_bgn")
transactionType String? @map("transaction_type")
payerAccount String? @map("payer_account")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("payments")
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
color String @default("#6b7280")
payments Payment[]
@@map("tags")
}
enum Status { UNPROCESSED SENT SKIPPED }
enum Source { INGEST UPLOAD }
```
**Key decisions:**
- No `User` model — Authentik owns identity.
- `currency`: `EUR` for SMS ingest, `BGN` for CSV uploads.
- `debitBgn`, `creditBgn`, `transactionType`, `payerAccount`: nullable CSV-only columns; INGEST rows store nulls. Avoids a union query for the unified list view.
- `balance` is always null for CSV rows (DSK export does not include running balance).
- Fresh consolidated migration — no data migration from reference apps required.
---
## API Routes
| Method | Path | Auth | Description |
|--------|------|------|-------------|
| GET | /api/health | public | Health check |
| POST | /api/payments/ingest | public | SMS or structured ingest (source=INGEST) |
| GET | /api/payments | required | List with filters/sort/pagination (+ source filter) |
| GET | /api/payments/meta/tags | required | All tags |
| GET | /api/payments/meta/filters | required | Filter options incl. `sources` array |
| GET | /api/payments/:id | required | Single payment |
| PATCH | /api/payments/:id | required | Update status |
| DELETE | /api/payments/:id | required | Delete |
| POST | /api/payments/:id/send | required | Send notification |
| POST | /api/payments/:id/skip | required | Skip |
| POST | /api/payments/:id/tags | required | Add/upsert tag |
| DELETE | /api/payments/:id/tags/:tagId | required | Remove tag |
| POST | /api/upload/csv | required | DSK CSV file upload (source=UPLOAD) |
---
## Key Implementation Details
### auth.js (replaces entire old auth module)
```js
const PUBLIC_PATHS = new Set(['/api/health', '/api/payments/ingest']);
function authentikMiddleware(req, res, next) {
if (PUBLIC_PATHS.has(req.path)) return next();
const username = req.headers['x-authentik-username'];
if (!username) return res.status(401).json({ error: 'Unauthorized' });
req.user = {
username,
email: req.headers['x-authentik-email'] || null,
groups: (req.headers['x-authentik-groups'] || '').split(',').map(g => g.trim()).filter(Boolean),
};
next();
}
module.exports = { authentikMiddleware };
```
### csvParser.js (port of dskuploader.py)
- `iconv-lite` decodes buffer as cp1251 (DSK Bank export encoding), falls back to UTF-8
- `csv-parse` parses the decoded text with `columns: true`
- Columns: `Дата`, `Вид на трансакцията`, `Основание`, `Дебит BGN`, `Кредит BGN`, `Наредител/Получател`, `Номер сметка на наредителя / получателя`
- Card extraction: regex `/^\d{6}x{6}\d{4}$/` on first token of `Основание`
- Skips rows where `Вид на трансакцията === 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ'`
- Auto-tags via keyword rules (ЗАПЛАТА→Salary, LIDL→Groceries, NETFLIX→Subscriptions, etc.) — same logic as Python `generate_tags()`
- Returns `{ rows: PaymentData[], skipped: number, errors: string[] }`
### payments.js changes from payments-logger
1. Add `source: 'INGEST'` and `currency` to the `/ingest` create call
2. Add `source` to the `GET /` where clause filter
3. Add `sources` to `meta/filters` response
4. Currency-aware amount formatting in notification message
5. Remove all JWT/auth references (no `/auth/register`, `/auth/login`)
### upload.js (new)
- `multer` memory storage, max 10 files × 10 MB
- Calls `parseDskCsv(buffer)` per file
- Upserts tags via `prisma.tag.upsert` then connects
- Returns `{ imported, skipped, errors, payments[] }`
### Frontend changes
- **Delete**: `auth.js`, `AuthProvider.jsx`
- **main.jsx**: Remove `<AuthProvider>` wrapper
- **App.jsx**: Replace `authFetch` with plain `fetch` (Authentik session cookie travels automatically); logout → `window.location.href = '/outpost.goauthentik.io/sign_out'`; add "Payments" / "Upload CSV" tab toggle
- **FilterBar.jsx**: Add source `<select>` (All / SMS Ingest / CSV Upload); widen grid to 5 cols
- **PaymentTable.jsx**: Add `Source` column with `SMS` (indigo) / `CSV` (emerald) badge; show `${amount} ${currency}` in amount cell
- **UploadPanel.jsx** (new): Drag-and-drop zone + file list + import button + result summary with error accordion; calls `POST /api/upload/csv` with `FormData`
---
## Docker Compose
```yaml
services:
db:
image: postgres:16-alpine
environment: { POSTGRES_USER: finance, POSTGRES_PASSWORD: [PASSWORD] POSTGRES_DB: finance_hub }
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck: { test: pg_isready -U finance -d finance_hub, interval: 5s }
backend:
build: ./backend
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports: ["${BACKEND_PORT:-3001}:3001"]
depends_on: { db: { condition: service_healthy } }
frontend:
build: ./frontend
ports: ["${FRONTEND_PORT:-5175}:5173"]
depends_on: [backend]
volumes: { pgdata: }
```
**NPM setup:** Frontend port proxied through Authentik forward auth. Backend port exposed separately (unprotected) so the public `/api/payments/ingest` remains reachable by iOS Shortcuts / SMS gateways without login.
---
## Environment Variables (.env)
```bash
[ENV_SECRET]
NOTIFIER_URL=https://notifier.lakylak.xyz
NOTIFIER_CHANNEL=viber
NOTIFY_DEFAULT_PHONE=[PHONE]
TZ=Europe/Sofia
BACKEND_PORT=3001
FRONTEND_PORT=5175
```
Removed vs payments-logger: `JWT_SECRET`, `JWT_EXPIRE_MINUTES`.
---
## Implementation Order
1. Create folder structure and write `docker-compose.yml`, `.env.example`, `.gitignore`
2. Write `backend/prisma/schema.prisma` and migration SQL
3. Write `backend/package.json` (add `csv-parse`, `iconv-lite`, `multer`; remove `bcryptjs`, `jose`)
4. Write `backend/Dockerfile`
5. Write `backend/src/auth.js` (Authentik middleware)
6. Copy `backend/src/parser.js` verbatim from payments-logger
7. Write `backend/src/csvParser.js` (Python port)
8. Write `backend/src/routes/upload.js`
9. Write `backend/src/routes/payments.js` (from payments-logger + 5 changes listed above)
10. Write `backend/src/index.js`
11. Copy frontend base from payments-logger; delete `auth.js` + `AuthProvider.jsx`
12. Update `main.jsx`, `App.jsx`, `FilterBar.jsx`, `PaymentTable.jsx`
13. Write `frontend/src/components/UploadPanel.jsx`
14. Update `frontend/vite.config.js`
15. `docker compose build && docker compose up -d`
16. Run verification checklist
---
## Verification
**Schema**
- `payments` table has `source`, `currency`, `debit_bgn`, `credit_bgn`, `transaction_type`, `payer_account`
- No `users` table; `Source` enum exists
**Auth**
- `GET /api/payments` → 401 without `x-authentik-username` header
- `POST /api/payments/ingest` → 201 without any header
- `curl -H "x-authentik-username: test" localhost:3001/api/payments` → 200
**SMS Ingest**
- DSK POS SMS → `source=INGEST`, `currency=EUR`, correct amount/card/recipient
- Apple Wallet structured body → `type=WALLET`, `source=INGEST`
- Rate limiter → 429 after 200 req/min
**CSV Upload**
- Single DSK CSV → rows with `source=UPLOAD`, `currency=BGN`
- Multiple CSVs in one request → all merged
- `ТРАНСФЕР СОБСТВЕНИ СМЕТКИ` rows counted in `skipped`, not imported
- Card regex match from `Основание` column
- Auto-tags applied (ЗАПЛАТА→Salary, LIDL→Groceries)
- cp1251 file imports correctly
**UI**
- Source badge visible in payment table (SMS indigo, CSV emerald)
- Source dropdown in FilterBar filters correctly
- Amount shows correct currency per row
- Upload Panel: drag-and-drop works, result summary shows counts
- Logout redirects to Authentik sign_out
- No login form shown (Authentik handles it at NPM level)
- Tags, send, skip, delete all still work
## Reference Files
- `/volume2/docker/finance/payments-logger/backend/src/routes/payments.js`
- `/volume2/docker/finance/payments-logger/backend/src/parser.js`
- `/volume2/docker/finance/payments-logger/backend/src/index.js`
- `/volume2/docker/finance/payments-logger/backend/src/auth.js`
- `/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma`
- `/volume2/docker/finance/payments-logger/frontend/src/App.jsx`
- `/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx`
- `/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx`
- `/volume2/docker/finance/dsk-uploader/dskuploader.py`
- `/volume2/docker/finance/auth/docker-compose.yml`
Claude’s Plan
ets-create-a-new-generic-sun.md
ets-create-a-new-generic-sun.md
Stayed in plan mode
Thinking
Thinking
Good question. Here's the full breakdown:
Backend Tech Stack — Options
Backend Tech Stack — Options
Option A: Node.js + Express + Prisma (my recommendation)
Option A: Node.js + Express + Prisma (my recommendation)
Why:
payments-logger is already Node.js/Express/Prisma. The new app is 80% payments-logger with CSV upload added on top. Keeping the same stack means:
Copy
parser.js
verbatim, zero rewrite
Copy the entire
routes/payments.js
with minimal edits
Same Prisma schema workflow, same migrations, same Docker image
The CSV parsing logic (the only Python-specific thing) ports cleanly to
csv-parse
— it's just regex + string manipulation, nothing pandas-specific
Trade-off:
Have to port the Python CSV parsing to JS. It's ~150 lines and mostly string manipulation — straightforward.
Option B: Python + FastAPI + SQLAlchemy
Option B: Python + FastAPI + SQLAlchemy
Rewrite everything in Python. dsk-uploader is Python, so CSV parsing is already done.
Pro:
Keep the dsk-uploader CSV logic as-is (no porting). Python has better data science libraries if you later add analytics.
Con:
Lose the entire payments-logger backend (routes, parser, Prisma schema) — full rewrite. FastAPI + SQLAlchemy is a different mental model than Express + Prisma. Frontend stays React anyway, so the stack split doesn't simplify anything.
Verdict:
More work overall, gains almost nothing.
Option C: Hybrid microservices (Node.js backend + Python CSV service)
Option C: Hybrid microservices (Node.js backend + Python CSV service)
Keep Node.js as the main API, add a separate Python FastAPI service just for CSV parsing. They share the DB.
Pro:
Zero porting — Python CSV code used as-is.
Con:
Two backend services to maintain, deploy, and keep in sync. Inter-service HTTP calls. Two Dockerfiles. For ~150 lines of CSV logic, this is massively over-engineered.
Verdict:
Not worth it.
Option D: Python + Flask (exactly like dsk-uploader)
Option D: Python + Flask (exactly like dsk-uploader)
Extend dsk-uploader into a full payments app.
Pro:
Pandas for CSV, no porting.
Con:
Jinja2 templates instead of React (or add React separately). Would need to reimplement the entire payments-logger (SMS parser, notification system, tag management, pagination/filtering). Flask's Jinja templating is far less capable than the existing React UI. The React frontend is the stronger UI foundation.
Verdict:
Worst of all options — rebuild the harder parts (UI, SMS parser, notification) for no gain.
Summary
Summary
Option
CSV porting effort
App rewrite effort
Result quality
A (Node.js)
Medium (150 lines)
Minimal
Best
B (Python FastAPI)
None
High (full backend)
Worse
C (Hybrid)
None
Low + infra overhead
Overkill
D (Python Flask)
None
Very high
Worst
Option
A (Node.js)
B (Python FastAPI)
C (Hybrid)
D (Python Flask)
CSV porting effort
Medium (150 lines)
None
None
None
App rewrite effort
Minimal
High (full backend)
Low + infra overhead
Very high
Result quality
Best
Worse
Overkill
Worst
Option
CSV porting effort
App rewrite effort
Result quality
The CSV parser port (the only cost of Option A) is a one-time ~150 line exercise. Everything else in the plan reuses payments-logger code directly. That's why Node.js is the clear winner here.
Want to adjust the stack, or shall I proceed with Option A?
Message actions
ok sounds good. Implement all you suggested
Thinking
Thinking
Starting implementation. Let me first read all the reference files I'll need to copy from.
Read
parser.js
parser.js
Read
payments.js
payments.js
,
index.js
index.js
Read
App.jsx
App.jsx
Read
FilterBar.jsx
FilterBar.jsx
Read
PaymentTable.jsx
PaymentTable.jsx
Thinking
Thinking
Now let me read the remaining frontend files and the Dockerfile from payments-logger.
Read
main.jsx
main.jsx
Read
index.css
index.css
Read
package.json
package.json
Read
Dockerfile
Dockerfile
Read
Dockerfile
Dockerfile
Read
vite.config.js
vite.config.js
Read
tailwind.config.js
tailwind.config.js
Read
postcss.config.js
postcss.config.js
Thinking
Thinking
Read
index.html
index.html
Read
dskuploader.py
dskuploader.py
Thinking
Thinking
Let me also grab the remaining frontend components.
Read
PaymentCard.jsx
PaymentCard.jsx
Read
PaymentList.jsx
PaymentList.jsx
Read
schema.prisma
schema.prisma
Thinking
Thinking
Good, I have everything I need. Let me set up the todo list and start building.
Thinking
Thinking
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile
Write backend src files (auth, parser, csvParser, index)
Write backend routes (payments.js, upload.js)
Write frontend config files
Write frontend React components
Build and verify with docker compose
Bash
Create finance-hub directory structure
IN
mkdir -p /volume2/docker/finance/finance-hub/backend/src/routes \
/volume2/docker/finance/finance-hub/backend/prisma/migrations/20260508_init \
/volume2/docker/finance/finance-hub/frontend/src/components && echo "done"
Copy code to clipboard
OUT
done
Write
docker-compose.yml
docker-compose.yml
45 lines
version: '3.8'
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: finance
POSTGRES_PASSWORD: [PASSWORD]
POSTGRES_DB: finance_hub
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U finance -d finance_hub"]
interval: 5s
timeout: 5s
retries: 5
backend:
build: ./backend
restart: unless-stopped
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports:
- "${BACKEND_PORT:-3001}:3001"
depends_on:
db:
condition: service_healthy
frontend:
build: ./frontend
restart: unless-stopped
ports:
- "${FRONTEND_PORT:-5175}:5173"
depends_on:
- backend
volumes:
pgdata:
Write
.env.example
.env.example
15 lines
# Database
[ENV_SECRET]
# Notifier service (for SMS payment notifications)
NOTIFIER_URL=https://notifier.lakylak.xyz
NOTIFIER_CHANNEL=viber
NOTIFY_DEFAULT_PHONE=[PHONE]
# Timezone (used by SMS parser for Bulgarian bank timestamps)
TZ=Europe/Sofia
# Ports (optional — defaults shown)
BACKEND_PORT=3001
FRONTEND_PORT=5175
Write
.gitignore
.gitignore
5 lines
.env
node_modules/
dist/
*.log
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
11894
|
530
|
41
|
2026-05-09T07:12:41.695497+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778310761695_m2.jpg...
|
Code
|
Design new payment-logge… — finance [SSH: nas]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: finance [SSH: nas]
Explorer Section: finance [SSH: nas]
FINANCE [SSH: NAS]
auth
dsk-uploader
finance-hub
backend
frontend
.env
.env.example
.gitignore
docker-compose.yml
payments-logger
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
docker-compose.yml, Editor Group 1
.env, Editor Group 1
report(1).csv, Editor Group 1
"Дата","Основание","Наредител/Получател","Номер сметка на наредителя / получателя","Вид на трансакцията","Свързваща референция","Валутен курс","Сума във валутата на превода","Дебит EUR","Кредит EUR"
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB","","","","","","","5,02",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB","","","","","","","15,46",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB","","","","","","","9,04",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421","BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR","","КАРТОВА ОПЕРАЦИЯ","","","","67,81",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446","BGR SOFIA CBA EKO MARKET","","КАРТОВА ОПЕРАЦИЯ","","","","5,51",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191","POL BALICE Lagardere Travel R KR3","","КАРТОВА ОПЕРАЦИЯ","","","","5,49",""
"Дата","Основание","Наредител/Получател","Номер сметка на наредителя / получателя","Вид на трансакцията","Свързваща референция","Валутен курс","Сума във валутата на превода","Дебит EUR","Кредит EUR"
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB","","","","","","","5,02",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB","","","","","","","15,46",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB","","","","","","","9,04",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421","BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR","","КАРТОВА ОПЕРАЦИЯ","","","","67,81",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446","BGR SOFIA CBA EKO MARKET","","КАРТОВА ОПЕРАЦИЯ","","","","5,51",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191","POL BALICE Lagardere Travel R KR3","","КАРТОВА ОПЕРАЦИЯ","","","","5,49",""
Design new payment-logge…, Editor Group 2
remote SSH: nas
SSH: nas
No Problems
0
0
No Ports Forwarded
0
Notifications
Sign In
Sign In
Info: Do you want to install the recommended 'Rainbow CSV' extension from mechatroner for report(1).csv?
Design new payment-logger and dsk-uploader hybrid app
Session history
New session
Message actions
payments.js
payments.js
ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.
Thinking
Thinking
I'll explore all three reference projects in parallel to understand their structure before planning.
Agent:
Explore payment-logger app structure and functionality
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How data flows (ingest, storage, retrieval)
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.
Agent:
Explore dsk-uploader app structure and functionality
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How file uploads work - what files, what format, how parsed
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.
Agent:
Explore auth folder and authentik integration
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. What auth system is being used (Authentik)
2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?
3. Middleware - how is auth enforced on routes?
4. Any frontend auth flow - login redirect, token handling, protected routes
5. Environment variables related to auth
6. Docker/deployment setup for the auth service itself
7. Any example of how other apps integrate with this auth
Report with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.
Message actions
payments.js
payments.js
continue
Thinking
Thinking
Launching parallel exploration of all three reference projects.
Agent:
Explore payment-logger app structure
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How data is ingested (look at /ingest route especially)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore dsk-uploader app structure
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How file uploads work (what format, what processing happens)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore auth project structure
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. What authentication system is used (authentik integration details)
3. How OAuth/OIDC flow works
4. Any middleware or helper functions for protecting routes
5. Session management approach
6. How frontend handles auth state
7. Any example of how other apps integrate with this auth system
8. Docker setup and environment variables
Please read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.
Thinking
Thinking
Now I have a complete picture of all three. Let me design the plan.
Agent:
Design combined app architecture
IN
Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:
---
## App 1: payments-logger (Node.js)
- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI
- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS
- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage
- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)
- **Schema** (PostgreSQL via Prisma):
- `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at
- `tags` table: id, name, color — M2M with payments via `_PaymentToTag`
- `users` table: id, username, hashed_password (this will be REMOVED)
- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system
- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance
## App 2: dsk-uploader (Python/Flask)
- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database
- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5
- **Auth**: None (open)
- **CSV format** (DSK Bank Bulgarian format, columns):
- `Дата` (date, DD.MM.YYYY)
- `Вид на трансакцията` (transaction type, Bulgarian)
- `Основание` (reason/description — contains card number regex: `^\d{6}x{6}\d{4}$`)
- `Дебит BGN` (debit amount, may be empty)
- `Кредит BGN` (credit amount, may be empty)
- `Наредител/Получател` (orderer/recipient name)
- `Номер сметка на наредителя / получателя` (account number)
- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers
- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)
## App 3: auth (Authentik)
- **Mode**: Proxy mode via NPM (forward auth)
- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:
- `X-authentik-username`
- `X-authentik-email`
- `X-authentik-groups`
- **No code integration needed** in the app itself — just trust these headers from NPM
- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`
---
## What the New Combined App Must Do
1. **Single PostgreSQL database** for all transactions
2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST
3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema
4. **Unified UI** — show all payments in one table regardless of source
5. **Source indicator** in UI — badge showing "INGEST", "UPLOAD", or "BOTH" (if duplicate detection added)
6. **Source filter** in FilterBar — filter by All/Ingest/Upload
7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM
8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination
9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL
---
## Technical Constraints
- Keep Node.js backend (not Python) — extend payments-logger's stack
- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)
- File upload: use `multer` npm middleware
- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)
- Add `source` enum field (INGEST/UPLOAD) to payments schema
- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is
- Remove `users` table from schema
---
## Please Design
1. Complete folder structure for the new app (suggest name: "finance-hub" or similar — note this is a placeholder, user will confirm)
2. Prisma schema with new fields (`source`, `currency`)
3. All backend API routes
4. CSV parser design in Node.js (port of the Python logic)
5. Authentik auth middleware
6. Frontend component structure (React) — what's reused from payments-logger, what's new
7. Docker Compose setup
8. Environment variables needed
9. Step-by-step implementation order
10. Verification checklist
Be specific about file paths and code structure. This will be used to write actual implementation code.
Thinking
Thinking
Good plan. Let me ask the one thing I need before writing the final plan.
AskUserQuestion
OUT
User has answered your questions: "What should the new combined app be called? This will be the folder name under /volume2/docker/finance/ and the app branding."="finance-hub". You can now continue with the user's answers in mind.
Thinking
Thinking
Writing the final plan now.
Thinking
Thinking
Write
ets-create-a-new-generic-sun.md
ets-create-a-new-generic-sun.md
326 lines
# finance-hub — Implementation Plan
## Context
Two separate finance apps exist as references and will be retired:
- **payments-logger** (Node.js/React): Ingests Bulgarian bank SMS notifications, stores payments in PostgreSQL, provides a review/tag/notify UI.
- **dsk-uploader** (Python/Flask): Uploads DSK bank CSV exports, parses them, sends to Notion.
The new app **finance-hub** (`/volume2/docker/finance/finance-hub/`) replaces both with a single unified system: all transactions (SMS-ingested and CSV-uploaded) land in one PostgreSQL database and one React UI. Authentication is delegated entirely to Authentik (proxy mode via NPM — no custom JWT).
---
## Tech Stack
| Layer | Choice | Rationale |
|-------|--------|-----------|
| Backend | Node.js 20 + Express + Prisma 5 | Extends payments-logger; no Python needed |
| CSV parsing | `csv-parse` + `iconv-lite` | Handles Bulgarian cp1251 encoding, RFC4180 quoted fields |
| File upload | `multer` (memory storage) | Bank CSVs are small (<500 KB), no disk cleanup needed |
| Database | PostgreSQL 16 | Same as payments-logger |
| Frontend | React 18 + Vite + Tailwind CSS + Lucide React | Same as payments-logger |
| Auth | Authentik proxy via NPM headers | No custom JWT; removes users table entirely |
| Container | Docker Compose | Same pattern as both reference apps |
**Removed vs payments-logger:** `bcryptjs`, `jose`, `users` table, login form, JWT storage.
**Removed vs dsk-uploader:** Python/Flask, Pandas, Notion SDK, all Notion references.
**Added:** `csv-parse`, `iconv-lite`, `multer`, `source` + `currency` fields, `UploadPanel` component.
---
## Folder Structure
```
/volume2/docker/finance/finance-hub/
├── docker-compose.yml
├── .env
├── .env.example
├── .gitignore
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ ├── prisma/
│ │ ├── schema.prisma
│ │ └── migrations/
│ │ ├── migration_lock.toml
│ │ └── 20260508_init/
│ │ └── migration.sql
│ └── src/
│ ├── index.js ← entry point (Authentik middleware wired here)
│ ├── auth.js ← Authentik header middleware (replaces JWT auth)
│ ├── parser.js ← SMS parser (copy verbatim from payments-logger)
│ ├── csvParser.js ← NEW: DSK CSV parser (port of Python dskuploader.py)
│ └── routes/
│ ├── payments.js ← existing routes + source/currency additions
│ └── upload.js ← NEW: POST /api/upload/csv
└── frontend/
├── Dockerfile
├── package.json
├── vite.config.js
├── tailwind.config.js
├── postcss.config.js
├── index.html
└── src/
├── main.jsx ← remove AuthProvider wrapper
├── index.css
├── App.jsx ← remove auth state, add Upload tab toggle
└── components/
├── FilterBar.jsx ← add source filter select
├── PaymentTable.jsx ← add Source badge column + currency display
├── PaymentCard.jsx ← minor source badge addition
├── PaymentList.jsx ← unchanged
└── UploadPanel.jsx ← NEW: drag-and-drop CSV upload UI
```
---
## Database Schema (Prisma)
File: `backend/prisma/schema.prisma`
```prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Payment {
id Int @id @default(autoincrement())
rawMessage String @map("raw_message")
date DateTime?
type String?
card String?
recipient String?
amount Float?
currency String? @default("EUR")
balance Float?
source Source @default(INGEST)
status Status @default(UNPROCESSED)
tags Tag[]
notifiedAt DateTime? @map("notified_at")
notifyPhone String? @map("notify_phone")
debitBgn Float? @map("debit_bgn")
creditBgn Float? @map("credit_bgn")
transactionType String? @map("transaction_type")
payerAccount String? @map("payer_account")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("payments")
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
color String @default("#6b7280")
payments Payment[]
@@map("tags")
}
enum Status { UNPROCESSED SENT SKIPPED }
enum Source { INGEST UPLOAD }
```
**Key decisions:**
- No `User` model — Authentik owns identity.
- `currency`: `EUR` for SMS ingest, `BGN` for CSV uploads.
- `debitBgn`, `creditBgn`, `transactionType`, `payerAccount`: nullable CSV-only columns; INGEST rows store nulls. Avoids a union query for the unified list view.
- `balance` is always null for CSV rows (DSK export does not include running balance).
- Fresh consolidated migration — no data migration from reference apps required.
---
## API Routes
| Method | Path | Auth | Description |
|--------|------|------|-------------|
| GET | /api/health | public | Health check |
| POST | /api/payments/ingest | public | SMS or structured ingest (source=INGEST) |
| GET | /api/payments | required | List with filters/sort/pagination (+ source filter) |
| GET | /api/payments/meta/tags | required | All tags |
| GET | /api/payments/meta/filters | required | Filter options incl. `sources` array |
| GET | /api/payments/:id | required | Single payment |
| PATCH | /api/payments/:id | required | Update status |
| DELETE | /api/payments/:id | required | Delete |
| POST | /api/payments/:id/send | required | Send notification |
| POST | /api/payments/:id/skip | required | Skip |
| POST | /api/payments/:id/tags | required | Add/upsert tag |
| DELETE | /api/payments/:id/tags/:tagId | required | Remove tag |
| POST | /api/upload/csv | required | DSK CSV file upload (source=UPLOAD) |
---
## Key Implementation Details
### auth.js (replaces entire old auth module)
```js
const PUBLIC_PATHS = new Set(['/api/health', '/api/payments/ingest']);
function authentikMiddleware(req, res, next) {
if (PUBLIC_PATHS.has(req.path)) return next();
const username = req.headers['x-authentik-username'];
if (!username) return res.status(401).json({ error: 'Unauthorized' });
req.user = {
username,
email: req.headers['x-authentik-email'] || null,
groups: (req.headers['x-authentik-groups'] || '').split(',').map(g => g.trim()).filter(Boolean),
};
next();
}
module.exports = { authentikMiddleware };
```
### csvParser.js (port of dskuploader.py)
- `iconv-lite` decodes buffer as cp1251 (DSK Bank export encoding), falls back to UTF-8
- `csv-parse` parses the decoded text with `columns: true`
- Columns: `Дата`, `Вид на трансакцията`, `Основание`, `Дебит BGN`, `Кредит BGN`, `Наредител/Получател`, `Номер сметка на наредителя / получателя`
- Card extraction: regex `/^\d{6}x{6}\d{4}$/` on first token of `Основание`
- Skips rows where `Вид на трансакцията === 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ'`
- Auto-tags via keyword rules (ЗАПЛАТА→Salary, LIDL→Groceries, NETFLIX→Subscriptions, etc.) — same logic as Python `generate_tags()`
- Returns `{ rows: PaymentData[], skipped: number, errors: string[] }`
### payments.js changes from payments-logger
1. Add `source: 'INGEST'` and `currency` to the `/ingest` create call
2. Add `source` to the `GET /` where clause filter
3. Add `sources` to `meta/filters` response
4. Currency-aware amount formatting in notification message
5. Remove all JWT/auth references (no `/auth/register`, `/auth/login`)
### upload.js (new)
- `multer` memory storage, max 10 files × 10 MB
- Calls `parseDskCsv(buffer)` per file
- Upserts tags via `prisma.tag.upsert` then connects
- Returns `{ imported, skipped, errors, payments[] }`
### Frontend changes
- **Delete**: `auth.js`, `AuthProvider.jsx`
- **main.jsx**: Remove `<AuthProvider>` wrapper
- **App.jsx**: Replace `authFetch` with plain `fetch` (Authentik session cookie travels automatically); logout → `window.location.href = '/outpost.goauthentik.io/sign_out'`; add "Payments" / "Upload CSV" tab toggle
- **FilterBar.jsx**: Add source `<select>` (All / SMS Ingest / CSV Upload); widen grid to 5 cols
- **PaymentTable.jsx**: Add `Source` column with `SMS` (indigo) / `CSV` (emerald) badge; show `${amount} ${currency}` in amount cell
- **UploadPanel.jsx** (new): Drag-and-drop zone + file list + import button + result summary with error accordion; calls `POST /api/upload/csv` with `FormData`
---
## Docker Compose
```yaml
services:
db:
image: postgres:16-alpine
environment: { POSTGRES_USER: finance, POSTGRES_PASSWORD: [PASSWORD] POSTGRES_DB: finance_hub }
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck: { test: pg_isready -U finance -d finance_hub, interval: 5s }
backend:
build: ./backend
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports: ["${BACKEND_PORT:-3001}:3001"]
depends_on: { db: { condition: service_healthy } }
frontend:
build: ./frontend
ports: ["${FRONTEND_PORT:-5175}:5173"]
depends_on: [backend]
volumes: { pgdata: }
```
**NPM setup:** Frontend port proxied through Authentik forward auth. Backend port exposed separately (unprotected) so the public `/api/payments/ingest` remains reachable by iOS Shortcuts / SMS gateways without login.
---
## Environment Variables (.env)
```bash
[ENV_SECRET]
NOTIFIER_URL=[URL_WITH_CREDENTIALS] @default(autoincrement())
rawMessage String @map("raw_message")
date DateTime?
type String?
card String?
recipient String?
amount Float?
currency String? @default("EUR")
balance Float?
source Source @default(INGEST)
status Status @default(UNPROCESSED)
tags Tag[]
notifiedAt DateTime? @map("notified_at")
notifyPhone String? @map("notify_phone")
debitBgn Float? @map("debit_bgn")
creditBgn Float? @map("credit_bgn")
transactionType String? @map("transaction_type")
payerAccount String? @map("payer_account")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("payments")
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
color String @default("#6b7280")
payments Payment[]
@@map("tags")
}
enum Status {
UNPROCESSED
SENT
SKIPPED
}
enum Source {
INGEST
UPLOAD
}
Write
migration.sql
migration.sql
55 lines
-- CreateEnum
CREATE TYPE "Status" AS ENUM ('UNPROCESSED', 'SENT', 'SKIPPED');
CREATE TYPE "Source" AS ENUM ('INGEST', 'UPLOAD');
-- CreateTable
CREATE TABLE "payments" (
"id" SERIAL PRIMARY KEY,
"raw_message" TEXT NOT NULL,
"date" TIMESTAMP(3),
"type" TEXT,
"card" TEXT,
"recipient" TEXT,
"amount" DOUBLE PRECISION,
"currency" TEXT DEFAULT 'EUR',
"balance" DOUBLE PRECISION,
"source" "Source" NOT NULL DEFAULT 'INGEST',
"status" "Status" NOT NULL DEFAULT 'UNPROCESSED',
"notified_at" TIMESTAMP(3),
"notify_phone" TEXT,
"debit_bgn" DOUBLE PRECISION,
"credit_bgn" DOUBLE PRECISION,
"transaction_type" TEXT,
"payer_account" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- CreateTable
CREATE TABLE "tags" (
"id" SERIAL PRIMARY KEY,
"name" TEXT NOT NULL,
"color" TEXT NOT NULL DEFAULT '#6b7280'
);
-- CreateUniqueIndex
CREATE UNIQUE INDEX "tags_name_key" ON "tags"("name");
-- CreateTable (M2M join)
CREATE TABLE "_PaymentToTag" (
"A" INTEGER NOT NULL,
"B" INTEGER NOT NULL,
CONSTRAINT "_PaymentToTag_AB_pkey" PRIMARY KEY ("A", "B")
);
CREATE INDEX "_PaymentToTag_B_index" ON "_PaymentToTag"("B");
-- AddForeignKey
ALTER TABLE "_PaymentToTag"
ADD CONSTRAINT "_PaymentToTag_A_fkey"
FOREIGN KEY ("A") REFERENCES "payments"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "_PaymentToTag"
ADD CONSTRAINT "_PaymentToTag_B_fkey"
FOREIGN KEY ("B") REFERENCES "tags"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Write
migration_lock.toml
migration_lock.toml
4 lines
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile
Write backend src files (auth, parser, csvParser, index)
Write backend routes (payments.js, upload.js)
Write frontend config files
Write frontend React components
Build and verify with docker compose
Write
package.json
package.json
26 lines
{
"name": "finance-hub-backend",
"version": "1.0.0",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js",
"prisma:generate": "prisma generate",
"prisma:migrate": "prisma migrate deploy"
},
"dependencies": {
"@prisma/client": "^5.22.0",
"cors": "^2.8.5",
"csv-parse": "^5.5.6",
"express": "^4.21.1",
"express-rate-limit": "^7.4.0",
"iconv-lite": "^0.6.3",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1"
},
"devDependencies": {
"nodemon": "^3.1.7",
"prisma": "^5.22.0"
}
}
Write
Dockerfile
Dockerfile
18 lines
FROM node:20-alpine
RUN apk add --no-cache openssl
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm install
COPY prisma ./prisma
RUN npx prisma generate
COPY src ./src
EXPOSE 3001
CMD ["sh", "-c", "npx prisma migrate deploy && node src/index.js"]
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile
Write backend src files (auth, parser, csvParser, index)
Write backend routes (payments.js, upload.js)
Write frontend config files
Write frontend React components
Build and verify with docker compose
Write
auth.js
auth.js
27 lines
const PUBLIC_PATHS = new Set([
'/api/health',
'/api/payments/ingest',
]);
function authentikMiddleware(req, res, next) {
if (PUBLIC_PATHS.has(req.path)) return next();
const username = req.headers['x-authentik-username'];
if (!username) {
return res.status(401).json({ error: 'Unauthorized — missing Authentik session' });
}
req.user = {
username,
email: req.headers['x-authentik-email'] || null,
groups: (req.headers['x-authentik-groups'] || '')
.split(',')
.map(g => g.trim())
.filter(Boolean),
};
next();
}
module.exports = { authentikMiddleware };
Write
parser.js
parser.js
104 lines
/**
* Parses SMS payment messages from Bulgarian banks (DSK Bank, etc.)
*
* Supported formats:
*
* POS / INTERNET / ECOM / P2P payment:
* DSK Bank. Na DD/MM/YYYY v HH:MM sa plateni AMOUNT CURRENCY s karta CARD na POS s adres: RECIPIENT. Nalichni: BALANCE CURRENCY.
*
* ATM withdrawal:
* DSK Bank. Na DD/MM/YYYY v HH:MM sa iztegleni AMOUNT CURRENCY s karta CARD ot ATM s adres: RECIPIENT. Nalichni: BALANCE CURRENCY.
*
* ATM utility payment (amount may include fee as AMOUNT/FEE):
* DSK Bank. Na DD/MM/YYYY v HH:MM sa plateni AMOUNT CURRENCY/FEE CURRENCY s karta CARD na ATM s adres:RECIPIENT. Nalichni: BALANCE CURRENCY.
*/
const LOCAL_TZ = process.env.TZ || 'Europe/Sofia';
/**
* Convert a local-timezone date/time to a UTC Date object.
* Uses Intl to resolve the actual UTC offset (DST-aware).
*/
function localToUtc(year, month, day, hour, minute) {
const naive = new Date(Date.UTC(year, month - 1, day, hour, minute, 0));
const formatter = new Intl.DateTimeFormat('en-US', {
timeZone: LOCAL_TZ,
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false,
});
const parts = {};
formatter.formatToParts(naive).forEach(p => { parts[p.type] = p.value; });
const localAtNaive = new Date(Date.UTC(
parseInt(parts.year), parseInt(parts.month) - 1, parseInt(parts.day),
parseInt(parts.hour) % 24, parseInt(parts.minute), parseInt(parts.second),
));
const offsetMs = localAtNaive.getTime() - naive.getTime();
return new Date(Date.UTC(year, month - 1, day, hour, minute, 0) - offsetMs);
}
function parsePaymentSms(message) {
const result = {
rawMessage: message,
date: null,
type: null,
card: null,
recipient: null,
amount: null,
balance: null,
};
// Date and time: "Na DD/MM/YYYY v HH:MM"
const dateMatch = message.match(/Na (\d{2})\/(\d{2})\/(\d{4}) v (\d{2}):(\d{2})/i);
if (dateMatch) {
const [, day, month, year, hour, minute] = dateMatch;
result.date = localToUtc(
parseInt(year), parseInt(month), parseInt(day),
parseInt(hour), parseInt(minute),
);
}
// Card mask: "s karta 400915***4447" or "s karta 483890***7162"
const cardMatch = message.match(/s karta\s+([\d*]+)/i);
if (cardMatch) {
result.card = cardMatch[1];
}
// Transaction type: supports both prepositions
// "na POS" / "na ATM" / "na INTERNET" etc. (payment)
// "ot ATM" (withdrawal)
const typeMatch = message.match(/(?:na|ot)\s+(POS|ATM|INTERNET|ECOM|P2P)\b/i);
if (typeMatch) {
result.type = typeMatch[1].toUpperCase();
}
// Recipient address: "s adres: MERCHANT" or "s adres:MERCHANT" (no space variant)
const recipientMatch = message.match(/s adres:\s*([^.]+)\./i);
if (recipientMatch) {
result.recipient = recipientMatch[1].trim();
}
// Amount: handles both verbs and the AMOUNT/FEE suffix format
// "sa plateni 7.78 EUR"
// "sa iztegleni 400.00 EUR"
// "sa plateni 0.50 EUR/0.50 EUR" → captures 0.50 (the charged amount, ignoring fee)
const amountMatch = message.match(/sa (?:plateni|iztegleni)\s+([\d.,]+)\s+[A-Z]{3}/i);
if (amountMatch) {
result.amount = parseFloat(amountMatch[1].replace(',', '.'));
}
// Balance: "Nalichni: 2583.07 EUR."
const balanceMatch = message.match(/Nalichni:\s*([\d.,]+)\s+[A-Z]{3}/i);
if (balanceMatch) {
result.balance = parseFloat(balanceMatch[1].replace(',', '.'));
}
return result;
}
module.exports = { parsePaymentSms };
Write
csvParser.js
csvParser.js
175 lines
/**
* DSK Bank CSV parser — Node.js port of dskuploader.py
*
* DSK Bank exports use Windows-1251 (cp1251) encoding.
* Each row maps to a Payment record with source=UPLOAD, currency=BGN.
*/
const { parse } = require('csv-parse');
const iconv = require('iconv-lite');
const SKIP_TYPE = 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ';
const CARD_REGEX = /^\d{6}x{6}\d{4}$/;
const POS_REGEX = /^\s*ПЛАЩАНЕ\s+НА\s+ПОС\s+\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2}/;
const COL = {
DATE: 'Дата',
TYPE: 'Вид на трансакцията',
REASON: 'Основание',
DEBIT: 'Дебит BGN',
CREDIT: 'Кредит BGN',
PAYEE: 'Наредител/Получател',
ACCT: 'Номер сметка на наредителя / получателя',
};
const TAG_RULES = [
['reason', 'ЗАПЛАТА', 'Salary'],
['reason', 'ТЕГЛЕНЕ НА ATM', 'ATM'],
['reason', 'ПЛАЩАНЕ ПО ЗАЕМ', 'Home Credit'],
['reason', 'АВТ.ТАКСА ОБСЛУЖВАНЕ', 'Bills'],
['transactionType', 'КОМУНАЛНИ УСЛУГИ', 'Bills'],
['payee', 'VIVACOM', 'Subscriptions'],
['payee', 'Google', 'Subscriptions'],
['payee', 'SkyShowtime', 'Subscriptions'],
['payee', 'NETFLIX', 'Subscriptions'],
['payee', 'LUKOIL', 'Bills'],
['payee', 'CityGate', 'Bills'],
['payee', 'CBA', 'Groceries'],
['payee', 'FANTASTICO', 'Groceries'],
['payee', 'LIDL', 'Groceries'],
];
function parseNum(val) {
if (val == null || val === '') return null;
if (typeof val === 'number') return isNaN(val) ? null : val;
const s = String(val).trim().replace(/\xa0/g, '').replace(/ /g, '').replace(',', '.');
const n = parseFloat(s);
return isNaN(n) ? null : n;
}
function parseDate(val) {
if (!val) return null;
const s = String(val).trim();
const m = s.match(/^(\d{2})\.(\d{2})\.(\d{4})$/);
if (m) {
return new Date(Date.UTC(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1])));
}
return null;
}
function processReasonAndCard(reason) {
if (!reason || typeof reason !== 'string') return { reason: '', card: null };
const parts = reason.trim().split(' ');
let card = null;
let cleanReason = reason.trim();
if (parts[0] && CARD_REGEX.test(parts[0])) {
card = parts[0];
cleanReason = parts.slice(1).join(' ').trim();
}
if (POS_REGEX.test(cleanReason)) {
const posParts = cleanReason.split('<br/>');
try {
const dateTime = posParts[0].split('ПОС ')[1];
cleanReason = `POS PAYMENT ${dateTime}`;
} catch (_) { /* keep original */ }
}
return { reason: cleanReason.replace(/\s+/g, ' ').trim(), card };
}
function generateTags(fields) {
const tags = new Set();
for (const [field, keyword, tagName] of TAG_RULES) {
if ((fields[field] || '').includes(keyword)) {
tags.add(tagName);
}
}
return Array.from(tags);
}
function processRow(row) {
const transactionType = (row[COL.TYPE] || '').trim();
if (transactionType === SKIP_TYPE) return null;
const { reason, card } = processReasonAndCard(row[COL.REASON]);
const payee = (row[COL.PAYEE] || '').trim();
const payerAccount = (row[COL.ACCT] || '').trim();
const debitBgn = parseNum(row[COL.DEBIT]);
const creditBgn = parseNum(row[COL.CREDIT]);
const date = parseDate(row[COL.DATE]);
const autoTags = generateTags({ reason, transactionType, payee, debitBgn, creditBgn });
const amount = debitBgn ?? creditBgn ?? null;
const rawMessage = [
row[COL.DATE] && `Date: ${row[COL.DATE]}`,
transactionType && `Type: ${transactionType}`,
payee && `Payee: ${payee}`,
debitBgn != null && `Debit: ${debitBgn} BGN`,
creditBgn != null && `Credit: ${creditBgn} BGN`,
].filter(Boolean).join(' | ');
return {
rawMessage,
date,
type: null,
card,
recipient: payee || null,
amount,
currency: 'BGN',
balance: null,
source: 'UPLOAD',
debitBgn,
creditBgn,
transactionType: transactionType || null,
payerAccount: payerAccount || null,
autoTags,
};
}
/**
* Parse a Buffer containing a DSK Bank CSV (cp1251 or UTF-8).
* Returns { rows, skipped, errors }.
*/
async function parseDskCsv(buffer) {
// Try cp1251 first (DSK Bank export encoding), fall back to UTF-8
let text = iconv.decode(buffer, 'cp1251');
if (!text.includes(COL.DATE)) {
text = buffer.toString('utf-8');
}
return new Promise((resolve, reject) => {
const rows = [];
const errors = [];
let skipped = 0;
const parser = parse(text, {
columns: true,
skip_empty_lines: true,
trim: true,
relax_column_count: true,
});
parser.on('readable', () => {
let record;
while ((record = parser.read()) !== null) {
try {
const row = processRow(record);
if (row === null) { skipped++; } else { rows.push(row); }
} catch (err) {
errors.push(err.message);
}
}
});
parser.on('error', reject);
parser.on('end', () => resolve({ rows, skipped, errors }));
});
}
module.exports = { parseDskCsv };
Write
index.js
index.js
39 lines
const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const rateLimit = require('express-rate-limit');
const { authentikMiddleware } = require('./auth');
const paymentsRouter = require('./routes/payments');
const uploadRouter = require('./routes/upload');
const app = express();
const PORT = process.env.PORT || 3001;
app.use(cors());
app.use(express.json({ limit: '16kb' }));
app.use(morgan('combined'));
// Rate-limit the public ingest endpoint before auth middleware
const ingestLimiter = rateLimit({
windowMs...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G)","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.2601756,"width":0.0019946808,"height":0.008778931},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.024933511,"top":0.056664005,"width":0.01662234,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Explorer Section: finance [SSH: nas]","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: finance [SSH: nas]","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.039228722,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"FINANCE [SSH: NAS]","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.039228722,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.07980846,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":17,"bounds":{"left":0.024933511,"top":0.07980846,"width":0.036901597,"height":0.0103751}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"auth","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.008976064,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.096568234,"width":0.0023271276,"height":0.011971269}},{"char_start":1,"char_count":3,"bounds":{"left":0.02825798,"top":0.096568234,"width":0.0066489363,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.11332801,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"dsk-uploader","depth":27,"bounds":{"left":0.025930852,"top":0.11332801,"width":0.026928192,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.11412609,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":11,"bounds":{"left":0.028590426,"top":0.11412609,"width":0.024268618,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.13088587,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"finance-hub","depth":27,"bounds":{"left":0.025930852,"top":0.13088587,"width":0.024268618,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.13168396,"width":0.0016622341,"height":0.011971269}},{"char_start":1,"char_count":10,"bounds":{"left":0.027593086,"top":0.13168396,"width":0.022938829,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.14844373,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":27,"bounds":{"left":0.028590426,"top":0.14844373,"width":0.017287234,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.14924182,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":6,"bounds":{"left":0.03125,"top":0.14924182,"width":0.01462766,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.1660016,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"frontend","depth":27,"bounds":{"left":0.028590426,"top":0.1660016,"width":0.017287234,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.16679968,"width":0.0016622341,"height":0.011971269}},{"char_start":1,"char_count":7,"bounds":{"left":0.03025266,"top":0.16679968,"width":0.015625,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.1819633,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env","depth":27,"bounds":{"left":0.028590426,"top":0.18355946,"width":0.00831117,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.18435754,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":3,"bounds":{"left":0.029920213,"top":0.18435754,"width":0.006981383,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.19952115,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env.example","depth":27,"bounds":{"left":0.028590426,"top":0.20111732,"width":0.025930852,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.2019154,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":11,"bounds":{"left":0.029920213,"top":0.2019154,"width":0.024933511,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.21707901,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"bounds":{"left":0.028590426,"top":0.21867518,"width":0.018949468,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.21947326,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":9,"bounds":{"left":0.029920213,"top":0.21947326,"width":0.017952127,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.021276595,"top":0.23463687,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"docker-compose.yml","depth":27,"bounds":{"left":0.028590426,"top":0.23623304,"width":0.042220745,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.23703113,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":17,"bounds":{"left":0.03125,"top":0.23703113,"width":0.03956117,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.25379092,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"payments-logger","depth":27,"bounds":{"left":0.025930852,"top":0.25379092,"width":0.034574468,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.254589,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":14,"bounds":{"left":0.028590426,"top":0.254589,"width":0.031914894,"height":0.011971269}}],"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01662234,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01662234,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.0029920214,"height":0.0103751}},{"char_start":1,"char_count":6,"bounds":{"left":0.025598405,"top":0.95131683,"width":0.013630319,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.01761968,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.01761968,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.0026595744,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.025265958,"top":0.9688747,"width":0.015292553,"height":0.0103751}}],"role_description":"text"},{"role":"AXRadioButton","text":"docker-compose.yml, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.0625,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":".env, Editor Group 1","depth":28,"bounds":{"left":0.17785904,"top":0.047885075,"width":0.040226065,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"report(1).csv, Editor Group 1","depth":28,"bounds":{"left":0.21775267,"top":0.047885075,"width":0.046210106,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.13264628,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.14827128,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.17586437,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"\"Дата\",\"Основание\",\"Наредител/Получател\",\"Номер сметка на наредителя / получателя\",\"Вид на трансакцията\",\"Свързваща референция\",\"Валутен курс\",\"Сума във валутата на превода\",\"Дебит EUR\",\"Кредит EUR\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB\",\"\",\"\",\"\",\"\",\"\",\"\",\"5,02\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB\",\"\",\"\",\"\",\"\",\"\",\"\",\"15,46\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB\",\"\",\"\",\"\",\"\",\"\",\"\",\"9,04\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421\",\"BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"67,81\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446\",\"BGR SOFIA CBA EKO MARKET\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"5,51\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191\",\"POL BALICE Lagardere Travel R KR3\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"5,49\",\"\"","depth":28,"bounds":{"left":0.13763298,"top":0.0933759,"width":0.42021278,"height":0.014365523},"on_screen":true,"value":"\"Дата\",\"Основание\",\"Наредител/Получател\",\"Номер сметка на наредителя / получателя\",\"Вид на трансакцията\",\"Свързваща референция\",\"Валутен курс\",\"Сума във валутата на превода\",\"Дебит EUR\",\"Кредит EUR\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB\",\"\",\"\",\"\",\"\",\"\",\"\",\"5,02\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB\",\"\",\"\",\"\",\"\",\"\",\"\",\"15,46\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB\",\"\",\"\",\"\",\"\",\"\",\"\",\"9,04\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421\",\"BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"67,81\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446\",\"BGR SOFIA CBA EKO MARKET\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"5,51\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191\",\"POL BALICE Lagardere Travel R KR3\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"5,49\",\"\"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"\"Дата\",\"Основание\",\"Наредител/Получател\",\"Номер сметка на наредителя / получателя\",\"Вид на трансакцията\",\"Свързваща референция\",\"Валутен курс\",\"Сума във валутата на превода\",\"Дебит EUR\",\"Кредит EUR\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB\",\"\",\"\",\"\",\"\",\"\",\"\",\"5,02\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB\",\"\",\"\",\"\",\"\",\"\",\"\",\"15,46\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB\",\"\",\"\",\"\",\"\",\"\",\"\",\"9,04\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421\",\"BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"67,81\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446\",\"BGR SOFIA CBA EKO MARKET\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"5,51\",\"\"\n\"08.05.2026\",\"400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191\",\"POL BALICE Lagardere Travel R KR3\",\"\",\"КАРТОВА ОПЕРАЦИЯ\",\"\",\"\",\"\",\"5,49\",\"\"","depth":29,"bounds":{"left":0.13763298,"top":0.09497207,"width":0.42021278,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.13763298,"top":0.09497207,"width":0.0023271276,"height":0.011173184}},{"char_start":1,"char_count":199,"bounds":{"left":0.13763298,"top":0.09497207,"width":0.47573137,"height":0.025538707}},{"char_start":200,"char_count":109,"bounds":{"left":0.13763298,"top":0.10933759,"width":0.25964096,"height":0.025538707}},{"char_start":309,"char_count":110,"bounds":{"left":0.13763298,"top":0.123703115,"width":0.26196808,"height":0.025538707}},{"char_start":419,"char_count":109,"bounds":{"left":0.13763298,"top":0.13806863,"width":0.25964096,"height":0.025538707}},{"char_start":528,"char_count":211,"bounds":{"left":0.13763298,"top":0.15243416,"width":0.5043218,"height":0.025538707}},{"char_start":739,"char_count":194,"bounds":{"left":0.13763298,"top":0.16679968,"width":0.4637633,"height":0.025538707}},{"char_start":933,"char_count":202,"bounds":{"left":0.13996011,"top":0.1811652,"width":0.48537233,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Design new payment-logge…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.07912234,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXButton","text":"remote SSH: nas","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.028590426,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.0033244682,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SSH: nas","depth":17,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.017952127,"height":0.011173184},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.008643617,"top":0.9856345,"width":0.0013297872,"height":0.011173184}},{"char_start":1,"char_count":7,"bounds":{"left":0.009973404,"top":0.9856345,"width":0.01462766,"height":0.011173184}}],"role_description":"text"},{"role":"AXButton","text":"No Problems","depth":16,"bounds":{"left":0.03025266,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.031914894,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.03723404,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.041888297,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.04720745,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"No Ports Forwarded","depth":16,"bounds":{"left":0.054521278,"top":0.98244214,"width":0.012632979,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.05618351,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"0","depth":17,"bounds":{"left":0.061502658,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sign In","depth":16,"bounds":{"left":0.9650931,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.96675533,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sign In","depth":17,"bounds":{"left":0.97207445,"top":0.9856345,"width":0.013962766,"height":0.011173184},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.97207445,"top":0.9856345,"width":0.0013297872,"height":0.011173184}},{"char_start":1,"char_count":6,"bounds":{"left":0.9734042,"top":0.9856345,"width":0.010638298,"height":0.011173184}}],"role_description":"text"},{"role":"AXStaticText","text":"Info: Do you want to install the recommended 'Rainbow CSV' extension from mechatroner for report(1).csv?","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Design new payment-logger and dsk-uploader hybrid app","depth":19,"bounds":{"left":0.55984044,"top":0.08060654,"width":0.099734046,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"payments.js","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"I'll explore all three reference projects in parallel to understand their structure before planning.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore payment-logger app structure and functionality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:\n1. Tech stack (frontend framework, backend framework, database)\n2. What the app does - its core purpose and features\n3. Database schema - all tables, relationships\n4. API routes - all endpoints, their purpose and request/response shapes\n5. How data flows (ingest, storage, retrieval)\n6. Any auth/middleware setup\n7. Docker/deployment setup\n8. Key files and their roles\n\nReport with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore dsk-uploader app structure and functionality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:\n1. Tech stack (frontend framework, backend framework, database)\n2. What the app does - its core purpose and features\n3. Database schema - all tables, relationships\n4. API routes - all endpoints, their purpose and request/response shapes\n5. How file uploads work - what files, what format, how parsed\n6. Any auth/middleware setup\n7. Docker/deployment setup\n8. Key files and their roles\n\nReport with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore auth folder and authentik integration","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:\n1. What auth system is being used (Authentik)\n2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?\n3. Middleware - how is auth enforced on routes?\n4. Any frontend auth flow - login redirect, token handling, protected routes\n5. Environment variables related to auth\n6. Docker/deployment setup for the auth service itself\n7. Any example of how other apps integrate with this auth\n\nReport with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"payments.js","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"continue","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Launching parallel exploration of all three reference projects.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore payment-logger app structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. Tech stack (frontend framework, backend framework, database, etc.)\n3. What the app does - its core functionality\n4. How data is ingested (look at /ingest route especially)\n5. Database schema (what tables/collections exist)\n6. API routes and their purposes\n7. Frontend pages and components\n8. Docker setup\n9. Any auth/session handling\n\nPlease read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore dsk-uploader app structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. Tech stack (frontend framework, backend framework, database, etc.)\n3. What the app does - its core functionality\n4. How file uploads work (what format, what processing happens)\n5. Database schema (what tables/collections exist)\n6. API routes and their purposes\n7. Frontend pages and components\n8. Docker setup\n9. Any auth/session handling\n\nPlease read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore auth project structure","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:\n1. Full directory structure (tree)\n2. What authentication system is used (authentik integration details)\n3. How OAuth/OIDC flow works\n4. Any middleware or helper functions for protecting routes\n5. Session management approach\n6. How frontend handles auth state\n7. Any example of how other apps integrate with this auth system\n8. Docker setup and environment variables\n\nPlease read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now I have a complete picture of all three. Let me design the plan.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Agent:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Design combined app architecture","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:\n\n---\n\n## App 1: payments-logger (Node.js)\n- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI\n- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS\n- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage\n- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)\n- **Schema** (PostgreSQL via Prisma):\n - `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at\n - `tags` table: id, name, color — M2M with payments via `_PaymentToTag`\n - `users` table: id, username, hashed_password (this will be REMOVED)\n- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system\n- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance\n\n## App 2: dsk-uploader (Python/Flask)\n- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database\n- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5\n- **Auth**: None (open)\n- **CSV format** (DSK Bank Bulgarian format, columns):\n - `Дата` (date, DD.MM.YYYY)\n - `Вид на трансакцията` (transaction type, Bulgarian)\n - `Основание` (reason/description — contains card number regex: `^\\d{6}x{6}\\d{4}$`)\n - `Дебит BGN` (debit amount, may be empty)\n - `Кредит BGN` (credit amount, may be empty)\n - `Наредител/Получател` (orderer/recipient name)\n - `Номер сметка на наредителя / получателя` (account number)\n- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers\n- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)\n\n## App 3: auth (Authentik)\n- **Mode**: Proxy mode via NPM (forward auth)\n- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:\n - `X-authentik-username` \n - `X-authentik-email`\n - `X-authentik-groups`\n- **No code integration needed** in the app itself — just trust these headers from NPM\n- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`\n\n---\n\n## What the New Combined App Must Do\n\n1. **Single PostgreSQL database** for all transactions\n2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST\n3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema\n4. **Unified UI** — show all payments in one table regardless of source\n5. **Source indicator** in UI — badge showing \"INGEST\", \"UPLOAD\", or \"BOTH\" (if duplicate detection added)\n6. **Source filter** in FilterBar — filter by All/Ingest/Upload\n7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM\n8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination\n9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL\n\n---\n\n## Technical Constraints\n\n- Keep Node.js backend (not Python) — extend payments-logger's stack\n- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)\n- File upload: use `multer` npm middleware\n- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)\n- Add `source` enum field (INGEST/UPLOAD) to payments schema\n- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is\n- Remove `users` table from schema\n\n---\n\n## Please Design\n\n1. Complete folder structure for the new app (suggest name: \"finance-hub\" or similar — note this is a placeholder, user will confirm)\n2. Prisma schema with new fields (`source`, `currency`)\n3. All backend API routes\n4. CSV parser design in Node.js (port of the Python logic)\n5. Authentik auth middleware\n6. Frontend component structure (React) — what's reused from payments-logger, what's new\n7. Docker Compose setup\n8. Environment variables needed\n9. Step-by-step implementation order\n10. Verification checklist\n\nBe specific about file paths and code structure. This will be used to write actual implementation code.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good plan. Let me ask the one thing I need before writing the final plan.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskUserQuestion","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"User has answered your questions: \"What should the new combined app be called? This will be the folder name under /volume2/docker/finance/ and the app branding.\"=\"finance-hub\". You can now continue with the user's answers in mind.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Writing the final plan now.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"ets-create-a-new-generic-sun.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ets-create-a-new-generic-sun.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"326 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"# finance-hub — Implementation Plan\n\n## Context\n\nTwo separate finance apps exist as references and will be retired:\n- **payments-logger** (Node.js/React): Ingests Bulgarian bank SMS notifications, stores payments in PostgreSQL, provides a review/tag/notify UI.\n- **dsk-uploader** (Python/Flask): Uploads DSK bank CSV exports, parses them, sends to Notion.\n\nThe new app **finance-hub** (`/volume2/docker/finance/finance-hub/`) replaces both with a single unified system: all transactions (SMS-ingested and CSV-uploaded) land in one PostgreSQL database and one React UI. Authentication is delegated entirely to Authentik (proxy mode via NPM — no custom JWT).\n\n---\n\n## Tech Stack\n\n| Layer | Choice | Rationale |\n|-------|--------|-----------|\n| Backend | Node.js 20 + Express + Prisma 5 | Extends payments-logger; no Python needed |\n| CSV parsing | `csv-parse` + `iconv-lite` | Handles Bulgarian cp1251 encoding, RFC4180 quoted fields |\n| File upload | `multer` (memory storage) | Bank CSVs are small (<500 KB), no disk cleanup needed |\n| Database | PostgreSQL 16 | Same as payments-logger |\n| Frontend | React 18 + Vite + Tailwind CSS + Lucide React | Same as payments-logger |\n| Auth | Authentik proxy via NPM headers | No custom JWT; removes users table entirely |\n| Container | Docker Compose | Same pattern as both reference apps |\n\n**Removed vs payments-logger:** `bcryptjs`, `jose`, `users` table, login form, JWT storage. \n**Removed vs dsk-uploader:** Python/Flask, Pandas, Notion SDK, all Notion references. \n**Added:** `csv-parse`, `iconv-lite`, `multer`, `source` + `currency` fields, `UploadPanel` component.\n\n---\n\n## Folder Structure\n\n```\n/volume2/docker/finance/finance-hub/\n├── docker-compose.yml\n├── .env\n├── .env.example\n├── .gitignore\n├── backend/\n│ ├── Dockerfile\n│ ├── package.json\n│ ├── prisma/\n│ │ ├── schema.prisma\n│ │ └── migrations/\n│ │ ├── migration_lock.toml\n│ │ └── 20260508_init/\n│ │ └── migration.sql\n│ └── src/\n│ ├── index.js ← entry point (Authentik middleware wired here)\n│ ├── auth.js ← Authentik header middleware (replaces JWT auth)\n│ ├── parser.js ← SMS parser (copy verbatim from payments-logger)\n│ ├── csvParser.js ← NEW: DSK CSV parser (port of Python dskuploader.py)\n│ └── routes/\n│ ├── payments.js ← existing routes + source/currency additions\n│ └── upload.js ← NEW: POST /api/upload/csv\n└── frontend/\n ├── Dockerfile\n ├── package.json\n ├── vite.config.js\n ├── tailwind.config.js\n ├── postcss.config.js\n ├── index.html\n └── src/\n ├── main.jsx ← remove AuthProvider wrapper\n ├── index.css\n ├── App.jsx ← remove auth state, add Upload tab toggle\n └── components/\n ├── FilterBar.jsx ← add source filter select\n ├── PaymentTable.jsx ← add Source badge column + currency display\n ├── PaymentCard.jsx ← minor source badge addition\n ├── PaymentList.jsx ← unchanged\n └── UploadPanel.jsx ← NEW: drag-and-drop CSV upload UI\n```\n\n---\n\n## Database Schema (Prisma)\n\nFile: `backend/prisma/schema.prisma`\n\n```prisma\ngenerator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Payment {\n id Int @id @default(autoincrement())\n rawMessage String @map(\"raw_message\")\n date DateTime?\n type String?\n card String?\n recipient String?\n amount Float?\n currency String? @default(\"EUR\")\n balance Float?\n source Source @default(INGEST)\n status Status @default(UNPROCESSED)\n tags Tag[]\n notifiedAt DateTime? @map(\"notified_at\")\n notifyPhone String? @map(\"notify_phone\")\n debitBgn Float? @map(\"debit_bgn\")\n creditBgn Float? @map(\"credit_bgn\")\n transactionType String? @map(\"transaction_type\")\n payerAccount String? @map(\"payer_account\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@map(\"payments\")\n}\n\nmodel Tag {\n id Int @id @default(autoincrement())\n name String @unique\n color String @default(\"#6b7280\")\n payments Payment[]\n\n @@map(\"tags\")\n}\n\nenum Status { UNPROCESSED SENT SKIPPED }\nenum Source { INGEST UPLOAD }\n```\n\n**Key decisions:**\n- No `User` model — Authentik owns identity.\n- `currency`: `EUR` for SMS ingest, `BGN` for CSV uploads.\n- `debitBgn`, `creditBgn`, `transactionType`, `payerAccount`: nullable CSV-only columns; INGEST rows store nulls. Avoids a union query for the unified list view.\n- `balance` is always null for CSV rows (DSK export does not include running balance).\n- Fresh consolidated migration — no data migration from reference apps required.\n\n---\n\n## API Routes\n\n| Method | Path | Auth | Description |\n|--------|------|------|-------------|\n| GET | /api/health | public | Health check |\n| POST | /api/payments/ingest | public | SMS or structured ingest (source=INGEST) |\n| GET | /api/payments | required | List with filters/sort/pagination (+ source filter) |\n| GET | /api/payments/meta/tags | required | All tags |\n| GET | /api/payments/meta/filters | required | Filter options incl. `sources` array |\n| GET | /api/payments/:id | required | Single payment |\n| PATCH | /api/payments/:id | required | Update status |\n| DELETE | /api/payments/:id | required | Delete |\n| POST | /api/payments/:id/send | required | Send notification |\n| POST | /api/payments/:id/skip | required | Skip |\n| POST | /api/payments/:id/tags | required | Add/upsert tag |\n| DELETE | /api/payments/:id/tags/:tagId | required | Remove tag |\n| POST | /api/upload/csv | required | DSK CSV file upload (source=UPLOAD) |\n\n---\n\n## Key Implementation Details\n\n### auth.js (replaces entire old auth module)\n```js\nconst PUBLIC_PATHS = new Set(['/api/health', '/api/payments/ingest']);\n\nfunction authentikMiddleware(req, res, next) {\n if (PUBLIC_PATHS.has(req.path)) return next();\n const username = req.headers['x-authentik-username'];\n if (!username) return res.status(401).json({ error: 'Unauthorized' });\n req.user = {\n username,\n email: req.headers['x-authentik-email'] || null,\n groups: (req.headers['x-authentik-groups'] || '').split(',').map(g => g.trim()).filter(Boolean),\n };\n next();\n}\nmodule.exports = { authentikMiddleware };\n```\n\n### csvParser.js (port of dskuploader.py)\n- `iconv-lite` decodes buffer as cp1251 (DSK Bank export encoding), falls back to UTF-8\n- `csv-parse` parses the decoded text with `columns: true`\n- Columns: `Дата`, `Вид на трансакцията`, `Основание`, `Дебит BGN`, `Кредит BGN`, `Наредител/Получател`, `Номер сметка на наредителя / получателя`\n- Card extraction: regex `/^\\d{6}x{6}\\d{4}$/` on first token of `Основание`\n- Skips rows where `Вид на трансакцията === 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ'`\n- Auto-tags via keyword rules (ЗАПЛАТА→Salary, LIDL→Groceries, NETFLIX→Subscriptions, etc.) — same logic as Python `generate_tags()`\n- Returns `{ rows: PaymentData[], skipped: number, errors: string[] }`\n\n### payments.js changes from payments-logger\n1. Add `source: 'INGEST'` and `currency` to the `/ingest` create call\n2. Add `source` to the `GET /` where clause filter\n3. Add `sources` to `meta/filters` response\n4. Currency-aware amount formatting in notification message\n5. Remove all JWT/auth references (no `/auth/register`, `/auth/login`)\n\n### upload.js (new)\n- `multer` memory storage, max 10 files × 10 MB\n- Calls `parseDskCsv(buffer)` per file\n- Upserts tags via `prisma.tag.upsert` then connects\n- Returns `{ imported, skipped, errors, payments[] }`\n\n### Frontend changes\n- **Delete**: `auth.js`, `AuthProvider.jsx`\n- **main.jsx**: Remove `<AuthProvider>` wrapper\n- **App.jsx**: Replace `authFetch` with plain `fetch` (Authentik session cookie travels automatically); logout → `window.location.href = '/outpost.goauthentik.io/sign_out'`; add \"Payments\" / \"Upload CSV\" tab toggle\n- **FilterBar.jsx**: Add source `<select>` (All / SMS Ingest / CSV Upload); widen grid to 5 cols\n- **PaymentTable.jsx**: Add `Source` column with `SMS` (indigo) / `CSV` (emerald) badge; show `${amount} ${currency}` in amount cell\n- **UploadPanel.jsx** (new): Drag-and-drop zone + file list + import button + result summary with error accordion; calls `POST /api/upload/csv` with `FormData`\n\n---\n\n## Docker Compose\n\n```yaml\nservices:\n db:\n image: postgres:16-alpine\n environment: { POSTGRES_USER: finance, POSTGRES_PASSWORD: ${DB_PASSWORD}, POSTGRES_DB: finance_hub }\n volumes: [pgdata:/var/lib/postgresql/data]\n healthcheck: { test: pg_isready -U finance -d finance_hub, interval: 5s }\n\n backend:\n build: ./backend\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports: [\"${BACKEND_PORT:-3001}:3001\"]\n depends_on: { db: { condition: service_healthy } }\n\n frontend:\n build: ./frontend\n ports: [\"${FRONTEND_PORT:-5175}:5173\"]\n depends_on: [backend]\n\nvolumes: { pgdata: }\n```\n\n**NPM setup:** Frontend port proxied through Authentik forward auth. Backend port exposed separately (unprotected) so the public `/api/payments/ingest` remains reachable by iOS Shortcuts / SMS gateways without login.\n\n---\n\n## Environment Variables (.env)\n\n```bash\nDB_PASSWORD=change_me\nNOTIFIER_URL=https://notifier.lakylak.xyz\nNOTIFIER_CHANNEL=viber\nNOTIFY_DEFAULT_PHONE=+359000000000\nTZ=Europe/Sofia\nBACKEND_PORT=3001\nFRONTEND_PORT=5175\n```\n\nRemoved vs payments-logger: `JWT_SECRET`, `JWT_EXPIRE_MINUTES`.\n\n---\n\n## Implementation Order\n\n1. Create folder structure and write `docker-compose.yml`, `.env.example`, `.gitignore`\n2. Write `backend/prisma/schema.prisma` and migration SQL\n3. Write `backend/package.json` (add `csv-parse`, `iconv-lite`, `multer`; remove `bcryptjs`, `jose`)\n4. Write `backend/Dockerfile`\n5. Write `backend/src/auth.js` (Authentik middleware)\n6. Copy `backend/src/parser.js` verbatim from payments-logger\n7. Write `backend/src/csvParser.js` (Python port)\n8. Write `backend/src/routes/upload.js`\n9. Write `backend/src/routes/payments.js` (from payments-logger + 5 changes listed above)\n10. Write `backend/src/index.js`\n11. Copy frontend base from payments-logger; delete `auth.js` + `AuthProvider.jsx`\n12. Update `main.jsx`, `App.jsx`, `FilterBar.jsx`, `PaymentTable.jsx`\n13. Write `frontend/src/components/UploadPanel.jsx`\n14. Update `frontend/vite.config.js`\n15. `docker compose build && docker compose up -d`\n16. Run verification checklist\n\n---\n\n## Verification\n\n**Schema**\n- `payments` table has `source`, `currency`, `debit_bgn`, `credit_bgn`, `transaction_type`, `payer_account`\n- No `users` table; `Source` enum exists\n\n**Auth**\n- `GET /api/payments` → 401 without `x-authentik-username` header\n- `POST /api/payments/ingest` → 201 without any header\n- `curl -H \"x-authentik-username: test\" localhost:3001/api/payments` → 200\n\n**SMS Ingest**\n- DSK POS SMS → `source=INGEST`, `currency=EUR`, correct amount/card/recipient\n- Apple Wallet structured body → `type=WALLET`, `source=INGEST`\n- Rate limiter → 429 after 200 req/min\n\n**CSV Upload**\n- Single DSK CSV → rows with `source=UPLOAD`, `currency=BGN`\n- Multiple CSVs in one request → all merged\n- `ТРАНСФЕР СОБСТВЕНИ СМЕТКИ` rows counted in `skipped`, not imported\n- Card regex match from `Основание` column\n- Auto-tags applied (ЗАПЛАТА→Salary, LIDL→Groceries)\n- cp1251 file imports correctly\n\n**UI**\n- Source badge visible in payment table (SMS indigo, CSV emerald)\n- Source dropdown in FilterBar filters correctly\n- Amount shows correct currency per row\n- Upload Panel: drag-and-drop works, result summary shows counts\n- Logout redirects to Authentik sign_out\n- No login form shown (Authentik handles it at NPM level)\n- Tags, send, skip, delete all still work\n\n## Reference Files\n\n- `/volume2/docker/finance/payments-logger/backend/src/routes/payments.js`\n- `/volume2/docker/finance/payments-logger/backend/src/parser.js`\n- `/volume2/docker/finance/payments-logger/backend/src/index.js`\n- `/volume2/docker/finance/payments-logger/backend/src/auth.js`\n- `/volume2/docker/finance/payments-logger/backend/prisma/schema.prisma`\n- `/volume2/docker/finance/payments-logger/frontend/src/App.jsx`\n- `/volume2/docker/finance/payments-logger/frontend/src/components/PaymentTable.jsx`\n- `/volume2/docker/finance/payments-logger/frontend/src/components/FilterBar.jsx`\n- `/volume2/docker/finance/dsk-uploader/dskuploader.py`\n- `/volume2/docker/finance/auth/docker-compose.yml`","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Claude’s Plan","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"ets-create-a-new-generic-sun.md","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ets-create-a-new-generic-sun.md","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Stayed in plan mode","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good question. Here's the full breakdown:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Backend Tech Stack — Options","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Backend Tech Stack — Options","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option A: Node.js + Express + Prisma (my recommendation)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option A: Node.js + Express + Prisma (my recommendation)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Why:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"payments-logger is already Node.js/Express/Prisma. The new app is 80% payments-logger with CSV upload added on top. Keeping the same stack means:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Copy","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"verbatim, zero rewrite","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Copy the entire","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"routes/payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"with minimal edits","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Same Prisma schema workflow, same migrations, same Docker image","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The CSV parsing logic (the only Python-specific thing) ports cleanly to","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"csv-parse","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— it's just regex + string manipulation, nothing pandas-specific","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Trade-off:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Have to port the Python CSV parsing to JS. It's ~150 lines and mostly string manipulation — straightforward.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option B: Python + FastAPI + SQLAlchemy","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option B: Python + FastAPI + SQLAlchemy","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Rewrite everything in Python. dsk-uploader is Python, so CSV parsing is already done.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pro:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Keep the dsk-uploader CSV logic as-is (no porting). Python has better data science libraries if you later add analytics.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Con:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Lose the entire payments-logger backend (routes, parser, Prisma schema) — full rewrite. FastAPI + SQLAlchemy is a different mental model than Express + Prisma. Frontend stays React anyway, so the stack split doesn't simplify anything.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Verdict:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"More work overall, gains almost nothing.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option C: Hybrid microservices (Node.js backend + Python CSV service)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option C: Hybrid microservices (Node.js backend + Python CSV service)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Keep Node.js as the main API, add a separate Python FastAPI service just for CSV parsing. They share the DB.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pro:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Zero porting — Python CSV code used as-is.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Con:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Two backend services to maintain, deploy, and keep in sync. Inter-service HTTP calls. Two Dockerfiles. For ~150 lines of CSV logic, this is massively over-engineered.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Verdict:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Not worth it.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Option D: Python + Flask (exactly like dsk-uploader)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Option D: Python + Flask (exactly like dsk-uploader)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Extend dsk-uploader into a full payments app.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pro:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Pandas for CSV, no porting.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Con:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Jinja2 templates instead of React (or add React separately). Would need to reimplement the entire payments-logger (SMS parser, notification system, tag management, pagination/filtering). Flask's Jinja templating is far less capable than the existing React UI. The React frontend is the stronger UI foundation.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Verdict:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worst of all options — rebuild the harder parts (UI, SMS parser, notification) for no gain.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Summary","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Summary","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Option","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CSV porting effort","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"App rewrite effort","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Result quality","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"A (Node.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Medium (150 lines)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Minimal","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Best","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"B (Python FastAPI)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"High (full backend)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worse","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"C (Hybrid)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Low + infra overhead","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Overkill","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"D (Python Flask)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Very high","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worst","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Option","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"A (Node.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"B (Python FastAPI)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"C (Hybrid)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"D (Python Flask)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CSV porting effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Medium (150 lines)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"None","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"App rewrite effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Minimal","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"High (full backend)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Low + infra overhead","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Very high","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Result quality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Best","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worse","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Overkill","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worst","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Option","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CSV porting effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"App rewrite effort","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Result quality","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The CSV parser port (the only cost of Option A) is a one-time ~150 line exercise. Everything else in the plan reuses payments-logger code directly. That's why Node.js is the clear winner here.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Want to adjust the stack, or shall I proceed with Option A?","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"ok sounds good. Implement all you suggested","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Starting implementation. Let me first read all the reference files I'll need to copy from.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"parser.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"payments.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"App.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"App.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"FilterBar.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"FilterBar.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentTable.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentTable.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now let me read the remaining frontend files and the Dockerfile from payments-logger.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"main.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.css","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.css","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"vite.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"vite.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"tailwind.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"tailwind.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"postcss.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"postcss.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"dskuploader.py","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"dskuploader.py","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Let me also grab the remaining frontend components.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentCard.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentCard.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaymentList.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaymentList.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"schema.prisma","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"schema.prisma","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good, I have everything I need. Let me set up the todo list and start building.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thinking","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thinking","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create finance-hub directory structure","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"mkdir -p /volume2/docker/finance/finance-hub/backend/src/routes \\\n /volume2/docker/finance/finance-hub/backend/prisma/migrations/20260508_init \\\n /volume2/docker/finance/finance-hub/frontend/src/components && echo \"done\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"done","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"docker-compose.yml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"docker-compose.yml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"45 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"version: '3.8'\n\nservices:\n db:\n image: postgres:16-alpine\n restart: unless-stopped\n environment:\n POSTGRES_USER: finance\n POSTGRES_PASSWORD: ${DB_PASSWORD}\n POSTGRES_DB: finance_hub\n volumes:\n - pgdata:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U finance -d finance_hub\"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n backend:\n build: ./backend\n restart: unless-stopped\n environment:\n DATABASE_URL: postgresql://finance:${DB_PASSWORD}@db:5432/finance_hub\n PORT: \"3001\"\n NOTIFIER_URL: ${NOTIFIER_URL}\n NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}\n NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}\n TZ: ${TZ:-Europe/Sofia}\n ports:\n - \"${BACKEND_PORT:-3001}:3001\"\n depends_on:\n db:\n condition: service_healthy\n\n frontend:\n build: ./frontend\n restart: unless-stopped\n ports:\n - \"${FRONTEND_PORT:-5175}:5173\"\n depends_on:\n - backend\n\nvolumes:\n pgdata:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".env.example","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".env.example","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"15 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"# Database\nDB_PASSWORD=change_me_strong_password\n\n# Notifier service (for SMS payment notifications)\nNOTIFIER_URL=https://notifier.lakylak.xyz\nNOTIFIER_CHANNEL=viber\nNOTIFY_DEFAULT_PHONE=+359000000000\n\n# Timezone (used by SMS parser for Bulgarian bank timestamps)\nTZ=Europe/Sofia\n\n# Ports (optional — defaults shown)\nBACKEND_PORT=3001\nFRONTEND_PORT=5175","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":".gitignore","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".gitignore","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"5 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".env\nnode_modules/\ndist/\n*.log","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"schema.prisma","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"schema.prisma","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"54 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Payment {\n id Int @id @default(autoincrement())\n rawMessage String @map(\"raw_message\")\n date DateTime?\n type String?\n card String?\n recipient String?\n amount Float?\n currency String? @default(\"EUR\")\n balance Float?\n source Source @default(INGEST)\n status Status @default(UNPROCESSED)\n tags Tag[]\n notifiedAt DateTime? @map(\"notified_at\")\n notifyPhone String? @map(\"notify_phone\")\n debitBgn Float? @map(\"debit_bgn\")\n creditBgn Float? @map(\"credit_bgn\")\n transactionType String? @map(\"transaction_type\")\n payerAccount String? @map(\"payer_account\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@map(\"payments\")\n}\n\nmodel Tag {\n id Int @id @default(autoincrement())\n name String @unique\n color String @default(\"#6b7280\")\n payments Payment[]\n\n @@map(\"tags\")\n}\n\nenum Status {\n UNPROCESSED\n SENT\n SKIPPED\n}\n\nenum Source {\n INGEST\n UPLOAD\n}","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"migration.sql","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"migration.sql","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"55 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"-- CreateEnum\nCREATE TYPE \"Status\" AS ENUM ('UNPROCESSED', 'SENT', 'SKIPPED');\nCREATE TYPE \"Source\" AS ENUM ('INGEST', 'UPLOAD');\n\n-- CreateTable\nCREATE TABLE \"payments\" (\n \"id\" SERIAL PRIMARY KEY,\n \"raw_message\" TEXT NOT NULL,\n \"date\" TIMESTAMP(3),\n \"type\" TEXT,\n \"card\" TEXT,\n \"recipient\" TEXT,\n \"amount\" DOUBLE PRECISION,\n \"currency\" TEXT DEFAULT 'EUR',\n \"balance\" DOUBLE PRECISION,\n \"source\" \"Source\" NOT NULL DEFAULT 'INGEST',\n \"status\" \"Status\" NOT NULL DEFAULT 'UNPROCESSED',\n \"notified_at\" TIMESTAMP(3),\n \"notify_phone\" TEXT,\n \"debit_bgn\" DOUBLE PRECISION,\n \"credit_bgn\" DOUBLE PRECISION,\n \"transaction_type\" TEXT,\n \"payer_account\" TEXT,\n \"created_at\" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,\n \"updated_at\" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n-- CreateTable\nCREATE TABLE \"tags\" (\n \"id\" SERIAL PRIMARY KEY,\n \"name\" TEXT NOT NULL,\n \"color\" TEXT NOT NULL DEFAULT '#6b7280'\n);\n\n-- CreateUniqueIndex\nCREATE UNIQUE INDEX \"tags_name_key\" ON \"tags\"(\"name\");\n\n-- CreateTable (M2M join)\nCREATE TABLE \"_PaymentToTag\" (\n \"A\" INTEGER NOT NULL,\n \"B\" INTEGER NOT NULL,\n CONSTRAINT \"_PaymentToTag_AB_pkey\" PRIMARY KEY (\"A\", \"B\")\n);\n\nCREATE INDEX \"_PaymentToTag_B_index\" ON \"_PaymentToTag\"(\"B\");\n\n-- AddForeignKey\nALTER TABLE \"_PaymentToTag\"\n ADD CONSTRAINT \"_PaymentToTag_A_fkey\"\n FOREIGN KEY (\"A\") REFERENCES \"payments\"(\"id\") ON DELETE CASCADE ON UPDATE CASCADE;\n\nALTER TABLE \"_PaymentToTag\"\n ADD CONSTRAINT \"_PaymentToTag_B_fkey\"\n FOREIGN KEY (\"B\") REFERENCES \"tags\"(\"id\") ON DELETE CASCADE ON UPDATE CASCADE;","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"migration_lock.toml","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"migration_lock.toml","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"4 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"# Please do not edit this file manually\n# It should be added in your version-control system (e.g., Git)\nprovider = \"postgresql\"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"26 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"{\n \"name\": \"finance-hub-backend\",\n \"version\": \"1.0.0\",\n \"main\": \"src/index.js\",\n \"scripts\": {\n \"start\": \"node src/index.js\",\n \"dev\": \"nodemon src/index.js\",\n \"prisma:generate\": \"prisma generate\",\n \"prisma:migrate\": \"prisma migrate deploy\"\n },\n \"dependencies\": {\n \"@prisma/client\": \"^5.22.0\",\n \"cors\": \"^2.8.5\",\n \"csv-parse\": \"^5.5.6\",\n \"express\": \"^4.21.1\",\n \"express-rate-limit\": \"^7.4.0\",\n \"iconv-lite\": \"^0.6.3\",\n \"morgan\": \"^1.10.0\",\n \"multer\": \"^1.4.5-lts.1\"\n },\n \"devDependencies\": {\n \"nodemon\": \"^3.1.7\",\n \"prisma\": \"^5.22.0\"\n }\n}","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"18 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FROM node:20-alpine\n\nRUN apk add --no-cache openssl\n\nWORKDIR /app\n\nCOPY package.json package-lock.json* ./\nRUN npm install\n\nCOPY prisma ./prisma\nRUN npx prisma generate\n\nCOPY src ./src\n\nEXPOSE 3001\n\nCMD [\"sh\", \"-c\", \"npx prisma migrate deploy && node src/index.js\"]","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"auth.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"auth.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"27 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"const PUBLIC_PATHS = new Set([\n '/api/health',\n '/api/payments/ingest',\n]);\n\nfunction authentikMiddleware(req, res, next) {\n if (PUBLIC_PATHS.has(req.path)) return next();\n\n const username = req.headers['x-authentik-username'];\n if (!username) {\n return res.status(401).json({ error: 'Unauthorized — missing Authentik session' });\n }\n\n req.user = {\n username,\n email: req.headers['x-authentik-email'] || null,\n groups: (req.headers['x-authentik-groups'] || '')\n .split(',')\n .map(g => g.trim())\n .filter(Boolean),\n };\n\n next();\n}\n\nmodule.exports = { authentikMiddleware };","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"parser.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"parser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"104 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/**\n * Parses SMS payment messages from Bulgarian banks (DSK Bank, etc.)\n *\n * Supported formats:\n *\n * POS / INTERNET / ECOM / P2P payment:\n * DSK Bank. Na DD/MM/YYYY v HH:MM sa plateni AMOUNT CURRENCY s karta CARD na POS s adres: RECIPIENT. Nalichni: BALANCE CURRENCY.\n *\n * ATM withdrawal:\n * DSK Bank. Na DD/MM/YYYY v HH:MM sa iztegleni AMOUNT CURRENCY s karta CARD ot ATM s adres: RECIPIENT. Nalichni: BALANCE CURRENCY.\n *\n * ATM utility payment (amount may include fee as AMOUNT/FEE):\n * DSK Bank. Na DD/MM/YYYY v HH:MM sa plateni AMOUNT CURRENCY/FEE CURRENCY s karta CARD na ATM s adres:RECIPIENT. Nalichni: BALANCE CURRENCY.\n */\n\nconst LOCAL_TZ = process.env.TZ || 'Europe/Sofia';\n\n/**\n * Convert a local-timezone date/time to a UTC Date object.\n * Uses Intl to resolve the actual UTC offset (DST-aware).\n */\nfunction localToUtc(year, month, day, hour, minute) {\n const naive = new Date(Date.UTC(year, month - 1, day, hour, minute, 0));\n\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: LOCAL_TZ,\n year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit',\n hour12: false,\n });\n\n const parts = {};\n formatter.formatToParts(naive).forEach(p => { parts[p.type] = p.value; });\n\n const localAtNaive = new Date(Date.UTC(\n parseInt(parts.year), parseInt(parts.month) - 1, parseInt(parts.day),\n parseInt(parts.hour) % 24, parseInt(parts.minute), parseInt(parts.second),\n ));\n\n const offsetMs = localAtNaive.getTime() - naive.getTime();\n return new Date(Date.UTC(year, month - 1, day, hour, minute, 0) - offsetMs);\n}\n\nfunction parsePaymentSms(message) {\n const result = {\n rawMessage: message,\n date: null,\n type: null,\n card: null,\n recipient: null,\n amount: null,\n balance: null,\n };\n\n // Date and time: \"Na DD/MM/YYYY v HH:MM\"\n const dateMatch = message.match(/Na (\\d{2})\\/(\\d{2})\\/(\\d{4}) v (\\d{2}):(\\d{2})/i);\n if (dateMatch) {\n const [, day, month, year, hour, minute] = dateMatch;\n result.date = localToUtc(\n parseInt(year), parseInt(month), parseInt(day),\n parseInt(hour), parseInt(minute),\n );\n }\n\n // Card mask: \"s karta 400915***4447\" or \"s karta 483890***7162\"\n const cardMatch = message.match(/s karta\\s+([\\d*]+)/i);\n if (cardMatch) {\n result.card = cardMatch[1];\n }\n\n // Transaction type: supports both prepositions\n // \"na POS\" / \"na ATM\" / \"na INTERNET\" etc. (payment)\n // \"ot ATM\" (withdrawal)\n const typeMatch = message.match(/(?:na|ot)\\s+(POS|ATM|INTERNET|ECOM|P2P)\\b/i);\n if (typeMatch) {\n result.type = typeMatch[1].toUpperCase();\n }\n\n // Recipient address: \"s adres: MERCHANT\" or \"s adres:MERCHANT\" (no space variant)\n const recipientMatch = message.match(/s adres:\\s*([^.]+)\\./i);\n if (recipientMatch) {\n result.recipient = recipientMatch[1].trim();\n }\n\n // Amount: handles both verbs and the AMOUNT/FEE suffix format\n // \"sa plateni 7.78 EUR\"\n // \"sa iztegleni 400.00 EUR\"\n // \"sa plateni 0.50 EUR/0.50 EUR\" → captures 0.50 (the charged amount, ignoring fee)\n const amountMatch = message.match(/sa (?:plateni|iztegleni)\\s+([\\d.,]+)\\s+[A-Z]{3}/i);\n if (amountMatch) {\n result.amount = parseFloat(amountMatch[1].replace(',', '.'));\n }\n\n // Balance: \"Nalichni: 2583.07 EUR.\"\n const balanceMatch = message.match(/Nalichni:\\s*([\\d.,]+)\\s+[A-Z]{3}/i);\n if (balanceMatch) {\n result.balance = parseFloat(balanceMatch[1].replace(',', '.'));\n }\n\n return result;\n}\n\nmodule.exports = { parsePaymentSms };","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"csvParser.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"csvParser.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"175 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/**\n * DSK Bank CSV parser — Node.js port of dskuploader.py\n *\n * DSK Bank exports use Windows-1251 (cp1251) encoding.\n * Each row maps to a Payment record with source=UPLOAD, currency=BGN.\n */\n\nconst { parse } = require('csv-parse');\nconst iconv = require('iconv-lite');\n\nconst SKIP_TYPE = 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ';\nconst CARD_REGEX = /^\\d{6}x{6}\\d{4}$/;\nconst POS_REGEX = /^\\s*ПЛАЩАНЕ\\s+НА\\s+ПОС\\s+\\d{2}\\.\\d{2}\\.\\d{4}\\s+\\d{2}:\\d{2}/;\n\nconst COL = {\n DATE: 'Дата',\n TYPE: 'Вид на трансакцията',\n REASON: 'Основание',\n DEBIT: 'Дебит BGN',\n CREDIT: 'Кредит BGN',\n PAYEE: 'Наредител/Получател',\n ACCT: 'Номер сметка на наредителя / получателя',\n};\n\nconst TAG_RULES = [\n ['reason', 'ЗАПЛАТА', 'Salary'],\n ['reason', 'ТЕГЛЕНЕ НА ATM', 'ATM'],\n ['reason', 'ПЛАЩАНЕ ПО ЗАЕМ', 'Home Credit'],\n ['reason', 'АВТ.ТАКСА ОБСЛУЖВАНЕ', 'Bills'],\n ['transactionType', 'КОМУНАЛНИ УСЛУГИ', 'Bills'],\n ['payee', 'VIVACOM', 'Subscriptions'],\n ['payee', 'Google', 'Subscriptions'],\n ['payee', 'SkyShowtime', 'Subscriptions'],\n ['payee', 'NETFLIX', 'Subscriptions'],\n ['payee', 'LUKOIL', 'Bills'],\n ['payee', 'CityGate', 'Bills'],\n ['payee', 'CBA', 'Groceries'],\n ['payee', 'FANTASTICO', 'Groceries'],\n ['payee', 'LIDL', 'Groceries'],\n];\n\nfunction parseNum(val) {\n if (val == null || val === '') return null;\n if (typeof val === 'number') return isNaN(val) ? null : val;\n const s = String(val).trim().replace(/\\xa0/g, '').replace(/ /g, '').replace(',', '.');\n const n = parseFloat(s);\n return isNaN(n) ? null : n;\n}\n\nfunction parseDate(val) {\n if (!val) return null;\n const s = String(val).trim();\n const m = s.match(/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/);\n if (m) {\n return new Date(Date.UTC(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1])));\n }\n return null;\n}\n\nfunction processReasonAndCard(reason) {\n if (!reason || typeof reason !== 'string') return { reason: '', card: null };\n\n const parts = reason.trim().split(' ');\n let card = null;\n let cleanReason = reason.trim();\n\n if (parts[0] && CARD_REGEX.test(parts[0])) {\n card = parts[0];\n cleanReason = parts.slice(1).join(' ').trim();\n }\n\n if (POS_REGEX.test(cleanReason)) {\n const posParts = cleanReason.split('<br/>');\n try {\n const dateTime = posParts[0].split('ПОС ')[1];\n cleanReason = `POS PAYMENT ${dateTime}`;\n } catch (_) { /* keep original */ }\n }\n\n return { reason: cleanReason.replace(/\\s+/g, ' ').trim(), card };\n}\n\nfunction generateTags(fields) {\n const tags = new Set();\n for (const [field, keyword, tagName] of TAG_RULES) {\n if ((fields[field] || '').includes(keyword)) {\n tags.add(tagName);\n }\n }\n return Array.from(tags);\n}\n\nfunction processRow(row) {\n const transactionType = (row[COL.TYPE] || '').trim();\n if (transactionType === SKIP_TYPE) return null;\n\n const { reason, card } = processReasonAndCard(row[COL.REASON]);\n const payee = (row[COL.PAYEE] || '').trim();\n const payerAccount = (row[COL.ACCT] || '').trim();\n const debitBgn = parseNum(row[COL.DEBIT]);\n const creditBgn = parseNum(row[COL.CREDIT]);\n const date = parseDate(row[COL.DATE]);\n\n const autoTags = generateTags({ reason, transactionType, payee, debitBgn, creditBgn });\n\n const amount = debitBgn ?? creditBgn ?? null;\n\n const rawMessage = [\n row[COL.DATE] && `Date: ${row[COL.DATE]}`,\n transactionType && `Type: ${transactionType}`,\n payee && `Payee: ${payee}`,\n debitBgn != null && `Debit: ${debitBgn} BGN`,\n creditBgn != null && `Credit: ${creditBgn} BGN`,\n ].filter(Boolean).join(' | ');\n\n return {\n rawMessage,\n date,\n type: null,\n card,\n recipient: payee || null,\n amount,\n currency: 'BGN',\n balance: null,\n source: 'UPLOAD',\n debitBgn,\n creditBgn,\n transactionType: transactionType || null,\n payerAccount: payerAccount || null,\n autoTags,\n };\n}\n\n/**\n * Parse a Buffer containing a DSK Bank CSV (cp1251 or UTF-8).\n * Returns { rows, skipped, errors }.\n */\nasync function parseDskCsv(buffer) {\n // Try cp1251 first (DSK Bank export encoding), fall back to UTF-8\n let text = iconv.decode(buffer, 'cp1251');\n if (!text.includes(COL.DATE)) {\n text = buffer.toString('utf-8');\n }\n\n return new Promise((resolve, reject) => {\n const rows = [];\n const errors = [];\n let skipped = 0;\n\n const parser = parse(text, {\n columns: true,\n skip_empty_lines: true,\n trim: true,\n relax_column_count: true,\n });\n\n parser.on('readable', () => {\n let record;\n while ((record = parser.read()) !== null) {\n try {\n const row = processRow(record);\n if (row === null) { skipped++; } else { rows.push(row); }\n } catch (err) {\n errors.push(err.message);\n }\n }\n });\n\n parser.on('error', reject);\n parser.on('end', () => resolve({ rows, skipped, errors }));\n });\n}\n\nmodule.exports = { parseDskCsv };","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"39 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"const express = require('express');\nconst cors = require('cors');\nconst morgan = require('morgan');\nconst rateLimit = require('express-rate-limit');\nconst { authentikMiddleware } = require('./auth');\nconst paymentsRouter = require('./routes/payments');\nconst uploadRouter = require('./routes/upload');\n\nconst app = express();\nconst PORT = process.env.PORT || 3001;\n\napp.use(cors());\napp.use(express.json({ limit: '16kb' }));\napp.use(morgan('combined'));\n\n// Rate-limit the public ingest endpoint before auth middleware\nconst ingestLimiter = rateLimit({\n windowMs: 60 * 1000,\n max: 200,\n standardHeaders: true,\n legacyHeaders: false,\n message: { error: 'Too many requests, slow down' },\n});\napp.use('/api/payments/ingest', ingestLimiter);\n\n// Authentik header auth (skips /api/health and /api/payments/ingest)\napp.use(authentikMiddleware);\n\napp.get('/api/health', (_req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.use('/api/payments', paymentsRouter);\napp.use('/api/upload', uploadRouter);\n\napp.listen(PORT, '0.0.0.0', () => {\n console.log(`Finance Hub API running on port ${PORT}`);\n});","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"payments.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"payments.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"399 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"const express = require('express');\nconst { PrismaClient } = require('@prisma/client');\nconst { parsePaymentSms } = require('../parser');\n\nconst router = express.Router();\nconst prisma = new PrismaClient();\n\nconst NOTIFIER_URL = process.env.NOTIFIER_URL;\nconst NOTIFIER_CHANNEL = process.env.NOTIFIER_CHANNEL || 'viber';\nconst DEFAULT_PHONE = process.env.NOTIFY_DEFAULT_PHONE;\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction parseId(raw) {\n const id = parseInt(raw, 10);\n return Number.isFinite(id) ? id : null;\n}\n\nfunction formatNotifyMessage(payment) {\n const currency = payment.currency || 'EUR';\n const parts = [];\n if (payment.amount != null) parts.push(`Amount: ${payment.amount.toFixed(2)} ${currency}`);\n if (payment.recipient) parts.push(`At: ${payment.recipient}`);\n if (payment.balance != null) parts.push(`Balance: ${payment.balance.toFixed(2)} ${currency}`);\n if (payment.date) parts.push(`Date: ${new Date(payment.date).toLocaleString('en-GB')}`);\n return parts.join('\\n');\n}\n\nasync function sendNotification(payment) {\n if (!NOTIFIER_URL) {\n console.warn('[NOTIFY] NOTIFIER_URL not set — skipping notification');\n return;\n }\n\n const phone = payment.notifyPhone || DEFAULT_PHONE;\n if (!phone) {\n console.warn('[NOTIFY] No phone number for payment #' + payment.id + ' and NOTIFY_DEFAULT_PHONE not set');\n return;\n }\n\n const body = {\n phone,\n notification: NOTIFIER_CHANNEL,\n message: formatNotifyMessage(payment),\n };\n\n const res = await fetch(NOTIFIER_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Notifier responded ${res.status}: ${text}`);\n }\n}\n\n// ── Ingest a payment (public — no auth) ──────────────────────────────────────\n//\n// Two modes:\n//\n// SMS mode (default):\n// { \"message\": \"<raw SMS text>\", \"notifyPhone\": \"...\" }\n//\n// Structured mode (Apple Wallet / manual):\n// { \"ingestMode\": \"apple_wallet\", \"amount\": 7.78, \"recipient\": \"Apple Store\",\n// \"type\": \"WALLET\", \"card\": \"••••4447\", \"date\": \"2026-02-22T10:30:00Z\" }\n//\nrouter.post('/ingest', async (req, res) => {\n try {\n const { message, notifyPhone, ingestMode } = req.body;\n\n let data;\n\n if (ingestMode === 'apple_wallet' || (!message && req.body.amount != null)) {\n // ── Structured / Apple Wallet mode ──────────────────────────────────────\n const { amount, recipient, type, card, date, balance } = req.body;\n if (amount == null || !recipient) {\n return res.status(400).json({ error: 'amount and recipient are required for structured ingest' });\n }\n\n const rawMessage = [\n `Source: ${ingestMode || 'structured'}`,\n `Amount: ${amount}`,\n recipient && `Recipient: ${recipient}`,\n type && `Type: ${type}`,\n card && `Card: ${card}`,\n ].filter(Boolean).join(' | ');\n\n data = {\n rawMessage,\n date: date ? new Date(date) : new Date(),\n type: type || 'WALLET',\n card: card || null,\n recipient,\n amount: parseFloat(amount),\n currency: 'EUR',\n balance: balance != null ? parseFloat(balance) : null,\n source: 'INGEST',\n notifyPhone: notifyPhone || null,\n };\n\n } else {\n // ── SMS mode ─────────────────────────────────────────────────────────────\n if (!message) {\n return res.status(400).json({ error: 'message is required' });\n }\n if (typeof message !== 'string' || message.length > 2000) {\n return res.status(400).json({ error: 'message must be a string under 2000 characters' });\n }\n\n const parsed = parsePaymentSms(message);\n data = {\n rawMessage: parsed.rawMessage,\n date: parsed.date,\n type: parsed.type,\n card: parsed.card,\n recipient: parsed.recipient,\n amount: parsed.amount,\n currency: 'EUR',\n balance: parsed.balance,\n source: 'INGEST',\n notifyPhone: notifyPhone || null,\n };\n }\n\n const payment = await prisma.payment.create({\n data,\n include: { tags: true },\n });\n\n res.status(201).json(payment);\n } catch (err) {\n console.error('Ingest error:', err);\n res.status(500).json({ error: 'Failed to ingest payment' });\n }\n});\n\n// ── List payments with filtering ──────────────────────────────────────────────\nrouter.get('/', async (req, res) => {\n try {\n const {\n status,\n type,\n tag,\n source,\n recipient,\n dateFrom,\n dateTo,\n search,\n sortBy = 'createdAt',\n sortDir = 'desc',\n page = 1,\n } = req.query;\n\n const limit = Math.min(parseInt(req.query.limit, 10) || 50, 200);\n\n const where = {};\n\n if (status) where.status = status;\n if (type) where.type = type;\n if (source) where.source = source;\n if (recipient) where.recipient = { contains: recipient, mode: 'insensitive' };\n if (tag) where.tags = { some: { name: tag } };\n if (search) {\n where.OR = [\n { rawMessage: { contains: search, mode: 'insensitive' } },\n { recipient: { contains: search, mode: 'insensitive' } },\n ];\n }\n if (dateFrom || dateTo) {\n where.date = {};\n if (dateFrom) where.date.gte = new Date(dateFrom);\n if (dateTo) where.date.lte = new Date(dateTo);\n }\n\n const allowedSortFields = ['date', 'amount', 'balance', 'recipient', 'type', 'source', 'createdAt', 'status'];\n const orderField = allowedSortFields.includes(sortBy) ? sortBy : 'createdAt';\n const orderDir = sortDir === 'asc' ? 'asc' : 'desc';\n\n const skip = (parseInt(page, 10) - 1) * limit;\n\n const [payments, total] = await Promise.all([\n prisma.payment.findMany({\n where,\n include: { tags: true },\n orderBy: { [orderField]: orderDir },\n skip,\n take: limit,\n }),\n prisma.payment.count({ where }),\n ]);\n\n res.json({ payments, total, page: parseInt(page, 10), limit });\n } catch (err) {\n console.error('List error:', err);\n res.status(500).json({ error: 'Failed to list payments' });\n }\n});\n\n// ── Get filter options ────────────────────────────────────────────────────────\nrouter.get('/meta/filters', async (_req, res) => {\n try {\n const [types, recipients, tags, sources] = await Promise.all([\n prisma.payment.findMany({ distinct: ['type'], select: { type: true }, where: { type: { not: null } } }),\n prisma.payment.findMany({ distinct: ['recipient'], select: { recipient: true }, where: { recipient: { not: null } } }),\n prisma.tag.findMany({ orderBy: { name: 'asc' } }),\n prisma.payment.findMany({ distinct: ['source'], select: { source: true } }),\n ]);\n\n res.json({\n types: types.map(t => t.type),\n recipients: recipients.map(r => r.recipient),\n tags,\n sources: sources.map(s => s.source),\n });\n } catch (err) {\n res.status(500).json({ error: 'Failed to get filters' });\n }\n});\n\n// ── Get all tags ──────────────────────────────────────────────────────────────\nrouter.get('/meta/tags', async (_req, res) => {\n try {\n const tags = await prisma.tag.findMany({ orderBy: { name: 'asc' } });\n res.json(tags);\n } catch (err) {\n res.status(500).json({ error: 'Failed to list tags' });\n }\n});\n\n// ── Get single payment ────────────────────────────────────────────────────────\nrouter.get('/:id', async (req, res) => {\n const id = parseId(req.params.id);\n if (id === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n const payment = await prisma.payment.findUnique({\n where: { id },\n include: { tags: true },\n });\n if (!payment) return res.status(404).json({ error: 'Not found' });\n res.json(payment);\n } catch (err) {\n console.error('Get error:', err);\n res.status(500).json({ error: 'Failed to get payment' });\n }\n});\n\n// ── Update payment metadata (status) ─────────────────────────────────────────\nrouter.patch('/:id', async (req, res) => {\n const id = parseId(req.params.id);\n if (id === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n const { status } = req.body;\n const data = {};\n\n if (status) {\n const validStatuses = ['UNPROCESSED', 'SENT', 'SKIPPED'];\n if (!validStatuses.includes(status)) {\n return res.status(400).json({ error: `Invalid status. Must be one of: ${validStatuses.join(', ')}` });\n }\n data.status = status;\n }\n\n if (Object.keys(data).length === 0) {\n return res.status(400).json({ error: 'No valid fields to update' });\n }\n\n const updated = await prisma.payment.update({\n where: { id },\n data,\n include: { tags: true },\n });\n res.json(updated);\n } catch (err) {\n if (err.code === 'P2025') return res.status(404).json({ error: 'Not found' });\n console.error('Update error:', err);\n res.status(500).json({ error: 'Failed to update payment' });\n }\n});\n\n// ── Delete payment ───────────────────────────────────────────────────────────\nrouter.delete('/:id', async (req, res) => {\n const id = parseId(req.params.id);\n if (id === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n await prisma.payment.delete({ where: { id } });\n res.json({ success: true });\n } catch (err) {\n if (err.code === 'P2025') return res.status(404).json({ error: 'Not found' });\n console.error('Delete error:', err);\n res.status(500).json({ error: 'Failed to delete payment' });\n }\n});\n\n// ── Send notification (mark as SENT + call notifier service) ─────────────────\nrouter.post('/:id/send', async (req, res) => {\n const id = parseId(req.params.id);\n if (id === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n const payment = await prisma.payment.findUnique({ where: { id } });\n if (!payment) return res.status(404).json({ error: 'Not found' });\n if (payment.status !== 'UNPROCESSED') {\n return res.status(409).json({ error: `Payment is already ${payment.status.toLowerCase()}` });\n }\n\n await sendNotification(payment);\n\n const updated = await prisma.payment.update({\n where: { id },\n data: { status: 'SENT', notifiedAt: new Date() },\n include: { tags: true },\n });\n\n res.json(updated);\n } catch (err) {\n console.error('Send error:', err);\n res.status(500).json({ error: 'Failed to send notification' });\n }\n});\n\n// ── Skip notification (mark as SKIPPED) ──────────────────────────────────────\nrouter.post('/:id/skip', async (req, res) => {\n const id = parseId(req.params.id);\n if (id === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n const payment = await prisma.payment.findUnique({ where: { id } });\n if (!payment) return res.status(404).json({ error: 'Not found' });\n if (payment.status !== 'UNPROCESSED') {\n return res.status(409).json({ error: `Payment is already ${payment.status.toLowerCase()}` });\n }\n\n const updated = await prisma.payment.update({\n where: { id },\n data: { status: 'SKIPPED' },\n include: { tags: true },\n });\n res.json(updated);\n } catch (err) {\n console.error('Skip error:', err);\n res.status(500).json({ error: 'Failed to skip payment' });\n }\n});\n\n// ── Add tag to payment ────────────────────────────────────────────────────────\nrouter.post('/:id/tags', async (req, res) => {\n const id = parseId(req.params.id);\n if (id === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n const { name, color } = req.body;\n if (!name) return res.status(400).json({ error: 'tag name is required' });\n\n const tag = await prisma.tag.upsert({\n where: { name },\n update: {},\n create: { name, color: color || '#6b7280' },\n });\n\n const updated = await prisma.payment.update({\n where: { id },\n data: { tags: { connect: { id: tag.id } } },\n include: { tags: true },\n });\n\n res.json(updated);\n } catch (err) {\n console.error('Tag error:', err);\n res.status(500).json({ error: 'Failed to add tag' });\n }\n});\n\n// ── Remove tag from payment ───────────────────────────────────────────────────\nrouter.delete('/:id/tags/:tagId', async (req, res) => {\n const id = parseId(req.params.id);\n const tagId = parseId(req.params.tagId);\n if (id === null || tagId === null) return res.status(400).json({ error: 'Invalid id' });\n\n try {\n const updated = await prisma.payment.update({\n where: { id },\n data: { tags: { disconnect: { id: tagId } } },\n include: { tags: true },\n });\n res.json(updated);\n } catch (err) {\n console.error('Remove tag error:', err);\n res.status(500).json({ error: 'Failed to remove tag' });\n }\n});\n\nmodule.exports = router;","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"upload.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"upload.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"89 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"const express = require('express');\nconst multer = require('multer');\nconst { PrismaClient } = require('@prisma/client');\nconst { parseDskCsv } = require('../csvParser');\n\nconst router = express.Router();\nconst prisma = new PrismaClient();\n\nconst upload = multer({\n storage: multer.memoryStorage(),\n limits: { fileSize: 10 * 1024 * 1024, files: 10 },\n fileFilter: (_req, file, cb) => {\n if (file.mimetype === 'text/csv' || file.originalname.toLowerCase().endsWith('.csv')) {\n cb(null, true);\n } else {\n cb(new Error('Only CSV files are accepted'));\n }\n },\n});\n\n// POST /api/upload/csv\n// Accepts 1-10 CSV files, parses them, stores to DB with source=UPLOAD.\n// Returns { imported, skipped, errors, payments[] }\nrouter.post('/csv', upload.array('files', 10), async (req, res) => {\n if (!req.files || req.files.length === 0) {\n return res.status(400).json({ error: 'No files uploaded' });\n }\n\n const allRows = [];\n const allErrors = [];\n let totalSkipped = 0;\n\n for (const file of req.files) {\n try {\n const { rows, skipped, errors } = await parseDskCsv(file.buffer);\n allRows.push(...rows);\n totalSkipped += skipped;\n allErrors.push(...errors.map(e => `${file.originalname}: ${e}`));\n } catch (err) {\n allErrors.push(`${file.originalname}: ${err.message}`);\n }\n }\n\n if (allRows.length === 0) {\n return res.status(422).json({\n error: 'No importable rows found',\n skipped: totalSkipped,\n errors: allErrors,\n });\n }\n\n const created = [];\n\n for (const row of allRows) {\n const { autoTags, ...paymentData } = row;\n try {\n const tagConnects = [];\n for (const tagName of autoTags) {\n const tag = await prisma.tag.upsert({\n where: { name: tagName },\n update: {},\n create: { name: tagName, color: '#6b7280' },\n });\n tagConnects.push({ id: tag.id });\n }\n\n const payment = await prisma.payment.create({\n data: {\n ...paymentData,\n ...(tagConnects.length ? { tags: { connect: tagConnects } } : {}),\n },\n include: { tags: true },\n });\n created.push(payment);\n } catch (err) {\n allErrors.push(`Row insert failed: ${err.message}`);\n }\n }\n\n res.status(201).json({\n imported: created.length,\n skipped: totalSkipped,\n errors: allErrors,\n payments: created,\n });\n});\n\nmodule.exports = router;","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now writing all frontend config files:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"package.json","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"package.json","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"24 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"{\n \"name\": \"finance-hub-frontend\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"lucide-react\": \"^0.460.0\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.3.12\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"autoprefixer\": \"^10.4.20\",\n \"postcss\": \"^8.4.49\",\n \"tailwindcss\": \"^3.4.15\",\n \"vite\": \"^6.0.1\"\n }\n}","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Dockerfile","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Dockerfile","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"13 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FROM node:20-alpine\n\nWORKDIR /app\n\nCOPY package.json package-lock.json* ./\nRUN npm install\n\nCOPY . .\n\nEXPOSE 5173\n\nCMD [\"npm\", \"run\", \"dev\"]","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"vite.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"vite.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"18 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [react()],\n server: {\n host: '0.0.0.0',\n port: 5173,\n allowedHosts: ['finance-hub.lakylak.xyz'],\n proxy: {\n '/api': {\n target: 'http://backend:3001',\n changeOrigin: true,\n },\n },\n },\n});","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"tailwind.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"tailwind.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"12 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/** @type {import('tailwindcss').Config} */\nexport default {\n content: [\n \"./index.html\",\n \"./src/**/*.{js,ts,jsx,tsx}\",\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n};","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"postcss.config.js","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"postcss.config.js","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"7 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"export default {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.html","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.html","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"14 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Finance Hub</title>\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>💰</text></svg>\" />\n </head>\n <body class=\"bg-gray-50 min-h-screen\">\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.jsx\"></script>\n </body>\n</html>","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"index.css","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"index.css","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"4 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"@tailwind base;\n@tailwind components;\n@tailwind utilities;","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Update Todos","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Create folder structure and root config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend Prisma schema and migration","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend package.json and Dockerfile","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend src files (auth, parser, csvParser, index)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write backend routes (payments.js, upload.js)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend config files","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write frontend React components","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Build and verify with docker compose","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now writing all React components:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"main.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"main.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"11 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\nReactDOM.createRoot(document.getElementById('root')).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>\n);","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Write","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"App.jsx","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"App.jsx","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"257 lines","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"import React, { useState, useEffect, useCallback } from 'react';\nimport { LayoutDashboard, Upload, RefreshCw, LogOut } from 'lucide-react';\nimport FilterBar from './components/FilterBar';\nimport PaymentTable from './components/PaymentTable';\nimport UploadPanel from './components/UploadPanel';\n\nconst API_BASE = '/api/payments';\n\nexport default function App() {\n const [activeTab, setActiveTab] = useState('payments');\n const [payments, setPayments] = useState([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [filters, setFilters] = useState({});\n const [sortBy, setSortBy] = useState('createdAt');\n const [sortDir, setSortDir] = useState('desc');\n const [filterOptions, setFilterOptions] = useState({ types: [], recipients: [], tags: [], sources: [] });\n const [loading, setLoading] = useState(false);\n\n const fetchPayments = useCallback(async () => {\n setLoading(true);\n try {\n const params = new URLSearchParams();\n params.set('page', page);\n params.set('limit', 50);\n params.set('sortBy', sortBy);\n params.set('sortDir', sortDir);\n Object.entries(filters).forEach(([key, val]) => {\n if (val) params.set(key, val);\n });\n const res = await fetch(`${API_BASE}?${params}`);\n const data = await res.json();\n setPayments(data.payments || []);\n setTotal(data.total || 0);\n } catch (err) {\n console.error('Failed to fetch payments:', err);\n } finally {\n setLoading(false);\n }\n }, [page, filters, sortBy, sortDir]);\n\n const fetchFilterOptions = useCallback(async () => {\n try {\n const res = await fetch(`${API_BASE}/meta/filters`);\n const data = await res.json();\n setFilterOptions(data);\n } catch (err) {\n console.error('Failed to fetch filter options:', err);\n }\n }, []);\n\n useEffect(() => {\n fetchPayments();\n }, [fetchPayments]);\n\n useEffect(() => {\n fetchFilterOptions();\n }, [fetchFilterOptions]);\n\n // Refresh payments list after a successful CSV upload\n const handleUploadSuccess = () => {\n fetchPayments();\n fetchFilterOptions();\n setActiveTab('payments');\n };\n\n const handleAction = async (id, action) => {\n try {\n await fetch(`${API_BASE}/${id}/${action}`, { method: 'POST' });\n fetchPayments();\n fetchFilterOptions();\n } catch (err) {\n console.error(`Failed to ${action} payment:`, err);\n }\n };\n\n const handleAddTag = async (id, tagName, tagColor) => {\n try {\n await fetch(`${API_BASE}/${id}/tags`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name: tagName, color: tagColor }),\n });\n fetchPayments();\n fetchFilterOptions();\n } catch (err) {\n console.error('Failed to add tag:', err);\n }\n };\n\n const handleRemoveTag = async (paymentId, tagId) => {\n try {\n await fetch(`${API_BASE}/${paymentId}/tags/${tagId}`, { method: 'DELETE' });\n fetchPayments();\n } catch (err) {\n console.error('Failed to remove tag:', err);\n }\n };\n\n const handleDelete = async (id) => {\n try {\n await fetch(`${API_BASE}/${id}`, { method: 'DELETE' });\n fetchPayments();\n fetchFilterOptions();\n } catch (err) {\n console.error('Failed to delete payment:', err);\n }\n };\n\n const handleUpdateStatus = async (id, status) => {\n try {\n await fetch(`${API_BASE}/${id}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ status }),\n });\n fetchPayments();\n } catch (err) {\n console.error('Failed to update status:', err);\n }\n };\n\n const handleFilterChange = (newFilters) => {\n setFilters(newFilters);\n setPage(1);\n };\n\n const handleSort = (field) => {\n if (sortBy === field) {\n setSortDir(d => d === 'asc' ? 'desc' : 'asc');\n } else {\n setSortBy(field);\n setSortDir('desc');\n }\n setPage(1);\n };\n\n const totalPages = Math.ceil(total / 50);\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n <header className=\"bg-white border-b border-gray-200 shadow-sm\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-indigo-600 p-2 rounded-lg\">\n <LayoutDashboard className=\"w-6 h-6 text-white\" />\n </div>\n <div>\n <h1 className=\"text-xl font-bold text-gray-900\">Finance Hub</h1>\n <p className=\"text-sm text-gray-500\">{total} transaction{total !== 1 ? 's' : ''} total</p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Tab switcher */}\n <div className=\"flex items-center rounded-lg border border-gray-200 bg-gray-50 p-1 gap-1\">\n <button\n onClick={() => setActiveTab('payments')}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${\n activeTab === 'payments'\n ? 'bg-white text-indigo-700 shadow-sm'\n : 'text-gray-600 hover:text-gray-900'\n }`}\n >\n <LayoutDashboard className=\"w-4 h-4\" />\n Payments\n </button>\n <button\n onClick={() => setActiveTab('upload')}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${\n activeTab === 'upload'\n ? 'bg-white text-emerald-700 shadow-sm'\n : 'text-gray-600 hover:text-gray-900'\n }`}\n >\n <Upload className=\"w-4 h-4\" />\n Upload CSV\n </button>\n </div>\n\n {activeTab === 'payments' && (\n <button\n onClick={() => { fetchPayments(); fetchFilterOptions(); }}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\n Refresh\n </button>\n )}\n\n <button\n onClick={() => { window.location.href = '/outpost.goauthentik.io/sign_out'; }}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n title=\"Sign out\"\n >\n <LogOut className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n </header>\n\n <main className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6\">\n {activeTab === 'payments' ? (\n <>\n <FilterBar\n filters={filters}\n filterOptions={filterOptions}\n onFilterChange={handleFilterChange}\n />\n\n <PaymentTable\n payments={payments}\n loading={loading}\n sortBy={sortBy}\n sortDir={sortDir}\n onSort={handleSort}\n onSend={(id) => handleAction(id, 'send')}\n onSkip={(id) => handleAction(id, 'skip')}\n onAddTag={handleAddTag}\n onRemoveTag={handleRemoveTag}\n onDelete={handleDelete}\n onUpdateStatus={handleUpdateStatus}\n existingTags={filterOptions.tags}\n />\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-center gap-2 mt-6\">\n <button\n onClick={() => setPage(p => Math.max(1, p - 1))}\n disabled={page === 1}\n className=\"px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Previous\n </button>\n <span className=\"text-sm text-gray-600\">\n Page {page} of {totalPages}\n </span>\n <button\n onClick={() => setPage(p => Math.min(totalPages, p + 1))}\n disabled={page === totalPages}\n className=\"px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Next\n </button>\n </div>\n )}\n </>\n ) : (\n <UploadPanel onUploadSuccess={handleUploadSuccess} />\n )}\n </main>\n </div>\n );\n}","depth":25,"on_screen":false,"role_description":"text"}]...
|
9123336834367040371
|
6809287908150012859
|
idle
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: finance [SSH: nas]
Explorer Section: finance [SSH: nas]
FINANCE [SSH: NAS]
auth
dsk-uploader
finance-hub
backend
frontend
.env
.env.example
.gitignore
docker-compose.yml
payments-logger
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
docker-compose.yml, Editor Group 1
.env, Editor Group 1
report(1).csv, Editor Group 1
"Дата","Основание","Наредител/Получател","Номер сметка на наредителя / получателя","Вид на трансакцията","Свързваща референция","Валутен курс","Сума във валутата на превода","Дебит EUR","Кредит EUR"
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB","","","","","","","5,02",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB","","","","","","","15,46",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB","","","","","","","9,04",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421","BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR","","КАРТОВА ОПЕРАЦИЯ","","","","67,81",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446","BGR SOFIA CBA EKO MARKET","","КАРТОВА ОПЕРАЦИЯ","","","","5,51",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191","POL BALICE Lagardere Travel R KR3","","КАРТОВА ОПЕРАЦИЯ","","","","5,49",""
"Дата","Основание","Наредител/Получател","Номер сметка на наредителя / получателя","Вид на трансакцията","Свързваща референция","Валутен курс","Сума във валутата на превода","Дебит EUR","Кредит EUR"
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:46<br/>Авт. код: 36C1UB","","","","","","","5,02",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:36<br/>Авт. код: 5CK9TB","","","","","","","15,46",""
"08.05.2026","400915xxxxxx4447 ПОС 08.05.2026 18:07<br/>Авт. код: 8FK4TB","","","","","","","9,04",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 08.05.2026 19:32<br/>Авт. код: 6NM31C<br/>Номер на у-во: V5411421","BGR SOFIYA LIDL BALGARIYA EOOD UL TODOR","","КАРТОВА ОПЕРАЦИЯ","","","","67,81",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 07.05.2026 09:02<br/>Авт. код: 7NE8N7<br/>Номер на у-во: 10101446","BGR SOFIA CBA EKO MARKET","","КАРТОВА ОПЕРАЦИЯ","","","","5,51",""
"08.05.2026","400915xxxxxx4447 ПЛАЩАНЕ НА ПОС 06.05.2026 13:16<br/>Авт. код: 1TV886<br/>Номер на у-во: 06030191","POL BALICE Lagardere Travel R KR3","","КАРТОВА ОПЕРАЦИЯ","","","","5,49",""
Design new payment-logge…, Editor Group 2
remote SSH: nas
SSH: nas
No Problems
0
0
No Ports Forwarded
0
Notifications
Sign In
Sign In
Info: Do you want to install the recommended 'Rainbow CSV' extension from mechatroner for report(1).csv?
Design new payment-logger and dsk-uploader hybrid app
Session history
New session
Message actions
payments.js
payments.js
ets create a new app that should be combination of payment-logger and dsk-uploader. It should have authorization via authentik (auth folder). All three folders (payment-logger, dsk-uploader and auth) are just refference these will be removed later. Auth project is separated it lives on its own. First reveiw them and see how these should be combined. It will be whole new app (also the folder name). Think very carefully of whatr these two apps do and how cold they be combined. THerer should be common db and uploader should store data the same way the /ingest does. It should be properly marked in UI if it is upload or ingest or both. FIrst think of tech stack and plan carefully.
Thinking
Thinking
I'll explore all three reference projects in parallel to understand their structure before planning.
Agent:
Explore payment-logger app structure and functionality
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How data flows (ingest, storage, retrieval)
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, and how data is ingested. Be thorough on the /ingest endpoint specifically.
Agent:
Explore dsk-uploader app structure and functionality
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Tech stack (frontend framework, backend framework, database)
2. What the app does - its core purpose and features
3. Database schema - all tables, relationships
4. API routes - all endpoints, their purpose and request/response shapes
5. How file uploads work - what files, what format, how parsed
6. Any auth/middleware setup
7. Docker/deployment setup
8. Key files and their roles
Report with: directory structure, tech stack summary, database schema details, all API endpoints listed, UI features, how file upload parsing works, and what data is extracted from uploads. Be very thorough about the data model and what fields are stored.
Agent:
Explore auth folder and authentik integration
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. What auth system is being used (Authentik)
2. How authentication/authorization is implemented - OAuth2, OIDC, session tokens, JWT?
3. Middleware - how is auth enforced on routes?
4. Any frontend auth flow - login redirect, token handling, protected routes
5. Environment variables related to auth
6. Docker/deployment setup for the auth service itself
7. Any example of how other apps integrate with this auth
Report with: directory structure, auth flow description, middleware code, environment variable names, and integration patterns. This is a reference for building auth into a new combined app.
Message actions
payments.js
payments.js
continue
Thinking
Thinking
Launching parallel exploration of all three reference projects.
Agent:
Explore payment-logger app structure
IN
Explore the /volume2/docker/finance/payments-logger directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How data is ingested (look at /ingest route especially)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore dsk-uploader app structure
IN
Explore the /volume2/docker/finance/dsk-uploader directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. Tech stack (frontend framework, backend framework, database, etc.)
3. What the app does - its core functionality
4. How file uploads work (what format, what processing happens)
5. Database schema (what tables/collections exist)
6. API routes and their purposes
7. Frontend pages and components
8. Docker setup
9. Any auth/session handling
Please read key files: package.json files, main entry points, route files, database schema files, docker-compose.yml, and any frontend components. Be thorough - I need a complete picture to plan a new combined app.
Agent:
Explore auth project structure
IN
Explore the /volume2/docker/finance/auth directory thoroughly. I need to understand:
1. Full directory structure (tree)
2. What authentication system is used (authentik integration details)
3. How OAuth/OIDC flow works
4. Any middleware or helper functions for protecting routes
5. Session management approach
6. How frontend handles auth state
7. Any example of how other apps integrate with this auth system
8. Docker setup and environment variables
Please read all files carefully - this auth system will be integrated into a new combined app. I need to understand exactly how to use it.
Thinking
Thinking
Now I have a complete picture of all three. Let me design the plan.
Agent:
Design combined app architecture
IN
Design a detailed implementation plan for a new combined web app that merges two existing applications. Here is full context:
---
## App 1: payments-logger (Node.js)
- **Purpose**: Ingest Bulgarian bank SMS → parse → store in PostgreSQL → review/tag/notify in React UI
- **Stack**: Node.js 20 + Express + Prisma 5 + PostgreSQL 16 + React 18 + Vite + Tailwind CSS
- **Auth**: Custom JWT (bcryptjs + jose), tokens in localStorage
- **Ingest**: POST /api/payments/ingest (public) — SMS text OR structured JSON (Apple Wallet)
- **Schema** (PostgreSQL via Prisma):
- `payments` table: id, raw_message, date, type (POS/ATM/INTERNET/ECOM/P2P/WALLET), card, recipient, amount, balance, status (UNPROCESSED/SENT/SKIPPED), notifyPhone, notifiedAt, created_at, updated_at
- `tags` table: id, name, color — M2M with payments via `_PaymentToTag`
- `users` table: id, username, hashed_password (this will be REMOVED)
- **UI**: Single-page React app — PaymentTable (sortable, filterable, taggable), FilterBar, status actions (send/skip), notification system
- **Parser** (backend/src/parser.js): Regex parser for Bulgarian DSK Bank SMS, extracts date/time (DD/MM/YYYY HH:MM), card mask, transaction type, recipient, amount, balance
## App 2: dsk-uploader (Python/Flask)
- **Purpose**: Upload DSK bank CSV exports → parse/normalize → upload to Notion database
- **Stack**: Python 3.11 + Flask + Pandas + Custom Notion SDK + Bootstrap 5
- **Auth**: None (open)
- **CSV format** (DSK Bank Bulgarian format, columns):
- `Дата` (date, DD.MM.YYYY)
- `Вид на трансакцията` (transaction type, Bulgarian)
- `Основание` (reason/description — contains card number regex: `^\d{6}x{6}\d{4}$`)
- `Дебит BGN` (debit amount, may be empty)
- `Кредит BGN` (credit amount, may be empty)
- `Наредител/Получател` (orderer/recipient name)
- `Номер сметка на наредителя / получателя` (account number)
- **Processing**: merge multiple CSVs, normalize dates, extract card numbers from reason via regex, auto-generate tags (keyword heuristics: ЗАПЛАТА→Salary, NETFLIX→Subscriptions, etc.), filter internal transfers
- **Output**: Notion database pages (this will be REPLACED with local PostgreSQL)
## App 3: auth (Authentik)
- **Mode**: Proxy mode via NPM (forward auth)
- **How it works**: NPM intercepts all requests, calls Authentik outpost's auth endpoint. On success, NPM injects headers into proxied request:
- `X-authentik-username`
- `X-authentik-email`
- `X-authentik-groups`
- **No code integration needed** in the app itself — just trust these headers from NPM
- **Logout**: Redirect user to `/outpost.goauthentik.io/sign_out`
---
## What the New Combined App Must Do
1. **Single PostgreSQL database** for all transactions
2. **SMS Ingest** (public endpoint) — same as payments-logger /ingest, source=INGEST
3. **CSV Upload** (authenticated) — parse DSK CSV files, store transactions with source=UPLOAD into the same DB schema
4. **Unified UI** — show all payments in one table regardless of source
5. **Source indicator** in UI — badge showing "INGEST", "UPLOAD", or "BOTH" (if duplicate detection added)
6. **Source filter** in FilterBar — filter by All/Ingest/Upload
7. **Authentik auth** — remove custom JWT entirely; trust X-authentik-* headers from NPM
8. **All existing payments-logger features**: tagging, send notification, skip, status tracking, filters, sorting, pagination
9. **Remove Notion dependency entirely** — all data stays in local PostgreSQL
---
## Technical Constraints
- Keep Node.js backend (not Python) — extend payments-logger's stack
- CSV parsing: use `csv-parse` npm package (handles encoding, streaming)
- File upload: use `multer` npm middleware
- Auth middleware: read X-authentik-username header, 401 if missing (but /api/payments/ingest stays public)
- Add `source` enum field (INGEST/UPLOAD) to payments schema
- Add `currency` field (EUR for SMS ingest, BGN for CSV uploads) — or just store as-is
- Remove `users` table from schema
---
## Please Design
1. Complete folder structure for the new app (suggest name: "finance-hub" or similar — note this is a placeholder, user will confirm)
2. Prisma schema with new fields (`source`, `currency`)
3. All backend API routes
4. CSV parser design in Node.js (port of the Python logic)
5. Authentik auth middleware
6. Frontend component structure (React) — what's reused from payments-logger, what's new
7. Docker Compose setup
8. Environment variables needed
9. Step-by-step implementation order
10. Verification checklist
Be specific about file paths and code structure. This will be used to write actual implementation code.
Thinking
Thinking
Good plan. Let me ask the one thing I need before writing the final plan.
AskUserQuestion
OUT
User has answered your questions: "What should the new combined app be called? This will be the folder name under /volume2/docker/finance/ and the app branding."="finance-hub". You can now continue with the user's answers in mind.
Thinking
Thinking
Writing the final plan now.
Thinking
Thinking
Write
ets-create-a-new-generic-sun.md
ets-create-a-new-generic-sun.md
326 lines
# finance-hub — Implementation Plan
## Context
Two separate finance apps exist as references and will be retired:
- **payments-logger** (Node.js/React): Ingests Bulgarian bank SMS notifications, stores payments in PostgreSQL, provides a review/tag/notify UI.
- **dsk-uploader** (Python/Flask): Uploads DSK bank CSV exports, parses them, sends to Notion.
The new app **finance-hub** (`/volume2/docker/finance/finance-hub/`) replaces both with a single unified system: all transactions (SMS-ingested and CSV-uploaded) land in one PostgreSQL database and one React UI. Authentication is delegated entirely to Authentik (proxy mode via NPM — no custom JWT).
---
## Tech Stack
| Layer | Choice | Rationale |
|-------|--------|-----------|
| Backend | Node.js 20 + Express + Prisma 5 | Extends payments-logger; no Python needed |
| CSV parsing | `csv-parse` + `iconv-lite` | Handles Bulgarian cp1251 encoding, RFC4180 quoted fields |
| File upload | `multer` (memory storage) | Bank CSVs are small (<500 KB), no disk cleanup needed |
| Database | PostgreSQL 16 | Same as payments-logger |
| Frontend | React 18 + Vite + Tailwind CSS + Lucide React | Same as payments-logger |
| Auth | Authentik proxy via NPM headers | No custom JWT; removes users table entirely |
| Container | Docker Compose | Same pattern as both reference apps |
**Removed vs payments-logger:** `bcryptjs`, `jose`, `users` table, login form, JWT storage.
**Removed vs dsk-uploader:** Python/Flask, Pandas, Notion SDK, all Notion references.
**Added:** `csv-parse`, `iconv-lite`, `multer`, `source` + `currency` fields, `UploadPanel` component.
---
## Folder Structure
```
/volume2/docker/finance/finance-hub/
├── docker-compose.yml
├── .env
├── .env.example
├── .gitignore
├── backend/
│ ├── Dockerfile
│ ├── package.json
│ ├── prisma/
│ │ ├── schema.prisma
│ │ └── migrations/
│ │ ├── migration_lock.toml
│ │ └── 20260508_init/
│ │ └── migration.sql
│ └── src/
│ ├── index.js ← entry point (Authentik middleware wired here)
│ ├── auth.js ← Authentik header middleware (replaces JWT auth)
│ ├── parser.js ← SMS parser (copy verbatim from payments-logger)
│ ├── csvParser.js ← NEW: DSK CSV parser (port of Python dskuploader.py)
│ └── routes/
│ ├── payments.js ← existing routes + source/currency additions
│ └── upload.js ← NEW: POST /api/upload/csv
└── frontend/
├── Dockerfile
├── package.json
├── vite.config.js
├── tailwind.config.js
├── postcss.config.js
├── index.html
└── src/
├── main.jsx ← remove AuthProvider wrapper
├── index.css
├── App.jsx ← remove auth state, add Upload tab toggle
└── components/
├── FilterBar.jsx ← add source filter select
├── PaymentTable.jsx ← add Source badge column + currency display
├── PaymentCard.jsx ← minor source badge addition
├── PaymentList.jsx ← unchanged
└── UploadPanel.jsx ← NEW: drag-and-drop CSV upload UI
```
---
## Database Schema (Prisma)
File: `backend/prisma/schema.prisma`
```prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Payment {
id Int @id @default(autoincrement())
rawMessage String @map("raw_message")
date DateTime?
type String?
card String?
recipient String?
amount Float?
currency String? @default("EUR")
balance Float?
source Source @default(INGEST)
status Status @default(UNPROCESSED)
tags Tag[]
notifiedAt DateTime? @map("notified_at")
notifyPhone String? @map("notify_phone")
debitBgn Float? @map("debit_bgn")
creditBgn Float? @map("credit_bgn")
transactionType String? @map("transaction_type")
payerAccount String? @map("payer_account")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("payments")
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
color String @default("#6b7280")
payments Payment[]
@@map("tags")
}
enum Status { UNPROCESSED SENT SKIPPED }
enum Source { INGEST UPLOAD }
```
**Key decisions:**
- No `User` model — Authentik owns identity.
- `currency`: `EUR` for SMS ingest, `BGN` for CSV uploads.
- `debitBgn`, `creditBgn`, `transactionType`, `payerAccount`: nullable CSV-only columns; INGEST rows store nulls. Avoids a union query for the unified list view.
- `balance` is always null for CSV rows (DSK export does not include running balance).
- Fresh consolidated migration — no data migration from reference apps required.
---
## API Routes
| Method | Path | Auth | Description |
|--------|------|------|-------------|
| GET | /api/health | public | Health check |
| POST | /api/payments/ingest | public | SMS or structured ingest (source=INGEST) |
| GET | /api/payments | required | List with filters/sort/pagination (+ source filter) |
| GET | /api/payments/meta/tags | required | All tags |
| GET | /api/payments/meta/filters | required | Filter options incl. `sources` array |
| GET | /api/payments/:id | required | Single payment |
| PATCH | /api/payments/:id | required | Update status |
| DELETE | /api/payments/:id | required | Delete |
| POST | /api/payments/:id/send | required | Send notification |
| POST | /api/payments/:id/skip | required | Skip |
| POST | /api/payments/:id/tags | required | Add/upsert tag |
| DELETE | /api/payments/:id/tags/:tagId | required | Remove tag |
| POST | /api/upload/csv | required | DSK CSV file upload (source=UPLOAD) |
---
## Key Implementation Details
### auth.js (replaces entire old auth module)
```js
const PUBLIC_PATHS = new Set(['/api/health', '/api/payments/ingest']);
function authentikMiddleware(req, res, next) {
if (PUBLIC_PATHS.has(req.path)) return next();
const username = req.headers['x-authentik-username'];
if (!username) return res.status(401).json({ error: 'Unauthorized' });
req.user = {
username,
email: req.headers['x-authentik-email'] || null,
groups: (req.headers['x-authentik-groups'] || '').split(',').map(g => g.trim()).filter(Boolean),
};
next();
}
module.exports = { authentikMiddleware };
```
### csvParser.js (port of dskuploader.py)
- `iconv-lite` decodes buffer as cp1251 (DSK Bank export encoding), falls back to UTF-8
- `csv-parse` parses the decoded text with `columns: true`
- Columns: `Дата`, `Вид на трансакцията`, `Основание`, `Дебит BGN`, `Кредит BGN`, `Наредител/Получател`, `Номер сметка на наредителя / получателя`
- Card extraction: regex `/^\d{6}x{6}\d{4}$/` on first token of `Основание`
- Skips rows where `Вид на трансакцията === 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ'`
- Auto-tags via keyword rules (ЗАПЛАТА→Salary, LIDL→Groceries, NETFLIX→Subscriptions, etc.) — same logic as Python `generate_tags()`
- Returns `{ rows: PaymentData[], skipped: number, errors: string[] }`
### payments.js changes from payments-logger
1. Add `source: 'INGEST'` and `currency` to the `/ingest` create call
2. Add `source` to the `GET /` where clause filter
3. Add `sources` to `meta/filters` response
4. Currency-aware amount formatting in notification message
5. Remove all JWT/auth references (no `/auth/register`, `/auth/login`)
### upload.js (new)
- `multer` memory storage, max 10 files × 10 MB
- Calls `parseDskCsv(buffer)` per file
- Upserts tags via `prisma.tag.upsert` then connects
- Returns `{ imported, skipped, errors, payments[] }`
### Frontend changes
- **Delete**: `auth.js`, `AuthProvider.jsx`
- **main.jsx**: Remove `<AuthProvider>` wrapper
- **App.jsx**: Replace `authFetch` with plain `fetch` (Authentik session cookie travels automatically); logout → `window.location.href = '/outpost.goauthentik.io/sign_out'`; add "Payments" / "Upload CSV" tab toggle
- **FilterBar.jsx**: Add source `<select>` (All / SMS Ingest / CSV Upload); widen grid to 5 cols
- **PaymentTable.jsx**: Add `Source` column with `SMS` (indigo) / `CSV` (emerald) badge; show `${amount} ${currency}` in amount cell
- **UploadPanel.jsx** (new): Drag-and-drop zone + file list + import button + result summary with error accordion; calls `POST /api/upload/csv` with `FormData`
---
## Docker Compose
```yaml
services:
db:
image: postgres:16-alpine
environment: { POSTGRES_USER: finance, POSTGRES_PASSWORD: [PASSWORD] POSTGRES_DB: finance_hub }
volumes: [pgdata:/var/lib/postgresql/data]
healthcheck: { test: pg_isready -U finance -d finance_hub, interval: 5s }
backend:
build: ./backend
environment:
DATABASE_URL: [CONNECTION_STRING]
PORT: "3001"
NOTIFIER_URL: ${NOTIFIER_URL}
NOTIFIER_CHANNEL: ${NOTIFIER_CHANNEL:-viber}
NOTIFY_DEFAULT_PHONE: ${NOTIFY_DEFAULT_PHONE}
TZ: ${TZ:-Europe/Sofia}
ports: ["${BACKEND_PORT:-3001}:3001"]
depends_on: { db: { condition: service_healthy } }
frontend:
build: ./frontend
ports: ["${FRONTEND_PORT:-5175}:5173"]
depends_on: [backend]
volumes: { pgdata: }
```
**NPM setup:** Frontend port proxied through Authentik forward auth. Backend port exposed separately (unprotected) so the public `/api/payments/ingest` remains reachable by iOS Shortcuts / SMS gateways without login.
---
## Environment Variables (.env)
```bash
[ENV_SECRET]
NOTIFIER_URL=[URL_WITH_CREDENTIALS] @default(autoincrement())
rawMessage String @map("raw_message")
date DateTime?
type String?
card String?
recipient String?
amount Float?
currency String? @default("EUR")
balance Float?
source Source @default(INGEST)
status Status @default(UNPROCESSED)
tags Tag[]
notifiedAt DateTime? @map("notified_at")
notifyPhone String? @map("notify_phone")
debitBgn Float? @map("debit_bgn")
creditBgn Float? @map("credit_bgn")
transactionType String? @map("transaction_type")
payerAccount String? @map("payer_account")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("payments")
}
model Tag {
id Int @id @default(autoincrement())
name String @unique
color String @default("#6b7280")
payments Payment[]
@@map("tags")
}
enum Status {
UNPROCESSED
SENT
SKIPPED
}
enum Source {
INGEST
UPLOAD
}
Write
migration.sql
migration.sql
55 lines
-- CreateEnum
CREATE TYPE "Status" AS ENUM ('UNPROCESSED', 'SENT', 'SKIPPED');
CREATE TYPE "Source" AS ENUM ('INGEST', 'UPLOAD');
-- CreateTable
CREATE TABLE "payments" (
"id" SERIAL PRIMARY KEY,
"raw_message" TEXT NOT NULL,
"date" TIMESTAMP(3),
"type" TEXT,
"card" TEXT,
"recipient" TEXT,
"amount" DOUBLE PRECISION,
"currency" TEXT DEFAULT 'EUR',
"balance" DOUBLE PRECISION,
"source" "Source" NOT NULL DEFAULT 'INGEST',
"status" "Status" NOT NULL DEFAULT 'UNPROCESSED',
"notified_at" TIMESTAMP(3),
"notify_phone" TEXT,
"debit_bgn" DOUBLE PRECISION,
"credit_bgn" DOUBLE PRECISION,
"transaction_type" TEXT,
"payer_account" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- CreateTable
CREATE TABLE "tags" (
"id" SERIAL PRIMARY KEY,
"name" TEXT NOT NULL,
"color" TEXT NOT NULL DEFAULT '#6b7280'
);
-- CreateUniqueIndex
CREATE UNIQUE INDEX "tags_name_key" ON "tags"("name");
-- CreateTable (M2M join)
CREATE TABLE "_PaymentToTag" (
"A" INTEGER NOT NULL,
"B" INTEGER NOT NULL,
CONSTRAINT "_PaymentToTag_AB_pkey" PRIMARY KEY ("A", "B")
);
CREATE INDEX "_PaymentToTag_B_index" ON "_PaymentToTag"("B");
-- AddForeignKey
ALTER TABLE "_PaymentToTag"
ADD CONSTRAINT "_PaymentToTag_A_fkey"
FOREIGN KEY ("A") REFERENCES "payments"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "_PaymentToTag"
ADD CONSTRAINT "_PaymentToTag_B_fkey"
FOREIGN KEY ("B") REFERENCES "tags"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Write
migration_lock.toml
migration_lock.toml
4 lines
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile
Write backend src files (auth, parser, csvParser, index)
Write backend routes (payments.js, upload.js)
Write frontend config files
Write frontend React components
Build and verify with docker compose
Write
package.json
package.json
26 lines
{
"name": "finance-hub-backend",
"version": "1.0.0",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js",
"prisma:generate": "prisma generate",
"prisma:migrate": "prisma migrate deploy"
},
"dependencies": {
"@prisma/client": "^5.22.0",
"cors": "^2.8.5",
"csv-parse": "^5.5.6",
"express": "^4.21.1",
"express-rate-limit": "^7.4.0",
"iconv-lite": "^0.6.3",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1"
},
"devDependencies": {
"nodemon": "^3.1.7",
"prisma": "^5.22.0"
}
}
Write
Dockerfile
Dockerfile
18 lines
FROM node:20-alpine
RUN apk add --no-cache openssl
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm install
COPY prisma ./prisma
RUN npx prisma generate
COPY src ./src
EXPOSE 3001
CMD ["sh", "-c", "npx prisma migrate deploy && node src/index.js"]
Update Todos
Create folder structure and root config files
Write backend Prisma schema and migration
Write backend package.json and Dockerfile
Write backend src files (auth, parser, csvParser, index)
Write backend routes (payments.js, upload.js)
Write frontend config files
Write frontend React components
Build and verify with docker compose
Write
auth.js
auth.js
27 lines
const PUBLIC_PATHS = new Set([
'/api/health',
'/api/payments/ingest',
]);
function authentikMiddleware(req, res, next) {
if (PUBLIC_PATHS.has(req.path)) return next();
const username = req.headers['x-authentik-username'];
if (!username) {
return res.status(401).json({ error: 'Unauthorized — missing Authentik session' });
}
req.user = {
username,
email: req.headers['x-authentik-email'] || null,
groups: (req.headers['x-authentik-groups'] || '')
.split(',')
.map(g => g.trim())
.filter(Boolean),
};
next();
}
module.exports = { authentikMiddleware };
Write
parser.js
parser.js
104 lines
/**
* Parses SMS payment messages from Bulgarian banks (DSK Bank, etc.)
*
* Supported formats:
*
* POS / INTERNET / ECOM / P2P payment:
* DSK Bank. Na DD/MM/YYYY v HH:MM sa plateni AMOUNT CURRENCY s karta CARD na POS s adres: RECIPIENT. Nalichni: BALANCE CURRENCY.
*
* ATM withdrawal:
* DSK Bank. Na DD/MM/YYYY v HH:MM sa iztegleni AMOUNT CURRENCY s karta CARD ot ATM s adres: RECIPIENT. Nalichni: BALANCE CURRENCY.
*
* ATM utility payment (amount may include fee as AMOUNT/FEE):
* DSK Bank. Na DD/MM/YYYY v HH:MM sa plateni AMOUNT CURRENCY/FEE CURRENCY s karta CARD na ATM s adres:RECIPIENT. Nalichni: BALANCE CURRENCY.
*/
const LOCAL_TZ = process.env.TZ || 'Europe/Sofia';
/**
* Convert a local-timezone date/time to a UTC Date object.
* Uses Intl to resolve the actual UTC offset (DST-aware).
*/
function localToUtc(year, month, day, hour, minute) {
const naive = new Date(Date.UTC(year, month - 1, day, hour, minute, 0));
const formatter = new Intl.DateTimeFormat('en-US', {
timeZone: LOCAL_TZ,
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false,
});
const parts = {};
formatter.formatToParts(naive).forEach(p => { parts[p.type] = p.value; });
const localAtNaive = new Date(Date.UTC(
parseInt(parts.year), parseInt(parts.month) - 1, parseInt(parts.day),
parseInt(parts.hour) % 24, parseInt(parts.minute), parseInt(parts.second),
));
const offsetMs = localAtNaive.getTime() - naive.getTime();
return new Date(Date.UTC(year, month - 1, day, hour, minute, 0) - offsetMs);
}
function parsePaymentSms(message) {
const result = {
rawMessage: message,
date: null,
type: null,
card: null,
recipient: null,
amount: null,
balance: null,
};
// Date and time: "Na DD/MM/YYYY v HH:MM"
const dateMatch = message.match(/Na (\d{2})\/(\d{2})\/(\d{4}) v (\d{2}):(\d{2})/i);
if (dateMatch) {
const [, day, month, year, hour, minute] = dateMatch;
result.date = localToUtc(
parseInt(year), parseInt(month), parseInt(day),
parseInt(hour), parseInt(minute),
);
}
// Card mask: "s karta 400915***4447" or "s karta 483890***7162"
const cardMatch = message.match(/s karta\s+([\d*]+)/i);
if (cardMatch) {
result.card = cardMatch[1];
}
// Transaction type: supports both prepositions
// "na POS" / "na ATM" / "na INTERNET" etc. (payment)
// "ot ATM" (withdrawal)
const typeMatch = message.match(/(?:na|ot)\s+(POS|ATM|INTERNET|ECOM|P2P)\b/i);
if (typeMatch) {
result.type = typeMatch[1].toUpperCase();
}
// Recipient address: "s adres: MERCHANT" or "s adres:MERCHANT" (no space variant)
const recipientMatch = message.match(/s adres:\s*([^.]+)\./i);
if (recipientMatch) {
result.recipient = recipientMatch[1].trim();
}
// Amount: handles both verbs and the AMOUNT/FEE suffix format
// "sa plateni 7.78 EUR"
// "sa iztegleni 400.00 EUR"
// "sa plateni 0.50 EUR/0.50 EUR" → captures 0.50 (the charged amount, ignoring fee)
const amountMatch = message.match(/sa (?:plateni|iztegleni)\s+([\d.,]+)\s+[A-Z]{3}/i);
if (amountMatch) {
result.amount = parseFloat(amountMatch[1].replace(',', '.'));
}
// Balance: "Nalichni: 2583.07 EUR."
const balanceMatch = message.match(/Nalichni:\s*([\d.,]+)\s+[A-Z]{3}/i);
if (balanceMatch) {
result.balance = parseFloat(balanceMatch[1].replace(',', '.'));
}
return result;
}
module.exports = { parsePaymentSms };
Write
csvParser.js
csvParser.js
175 lines
/**
* DSK Bank CSV parser — Node.js port of dskuploader.py
*
* DSK Bank exports use Windows-1251 (cp1251) encoding.
* Each row maps to a Payment record with source=UPLOAD, currency=BGN.
*/
const { parse } = require('csv-parse');
const iconv = require('iconv-lite');
const SKIP_TYPE = 'ТРАНСФЕР СОБСТВЕНИ СМЕТКИ';
const CARD_REGEX = /^\d{6}x{6}\d{4}$/;
const POS_REGEX = /^\s*ПЛАЩАНЕ\s+НА\s+ПОС\s+\d{2}\.\d{2}\.\d{4}\s+\d{2}:\d{2}/;
const COL = {
DATE: 'Дата',
TYPE: 'Вид на трансакцията',
REASON: 'Основание',
DEBIT: 'Дебит BGN',
CREDIT: 'Кредит BGN',
PAYEE: 'Наредител/Получател',
ACCT: 'Номер сметка на наредителя / получателя',
};
const TAG_RULES = [
['reason', 'ЗАПЛАТА', 'Salary'],
['reason', 'ТЕГЛЕНЕ НА ATM', 'ATM'],
['reason', 'ПЛАЩАНЕ ПО ЗАЕМ', 'Home Credit'],
['reason', 'АВТ.ТАКСА ОБСЛУЖВАНЕ', 'Bills'],
['transactionType', 'КОМУНАЛНИ УСЛУГИ', 'Bills'],
['payee', 'VIVACOM', 'Subscriptions'],
['payee', 'Google', 'Subscriptions'],
['payee', 'SkyShowtime', 'Subscriptions'],
['payee', 'NETFLIX', 'Subscriptions'],
['payee', 'LUKOIL', 'Bills'],
['payee', 'CityGate', 'Bills'],
['payee', 'CBA', 'Groceries'],
['payee', 'FANTASTICO', 'Groceries'],
['payee', 'LIDL', 'Groceries'],
];
function parseNum(val) {
if (val == null || val === '') return null;
if (typeof val === 'number') return isNaN(val) ? null : val;
const s = String(val).trim().replace(/\xa0/g, '').replace(/ /g, '').replace(',', '.');
const n = parseFloat(s);
return isNaN(n) ? null : n;
}
function parseDate(val) {
if (!val) return null;
const s = String(val).trim();
const m = s.match(/^(\d{2})\.(\d{2})\.(\d{4})$/);
if (m) {
return new Date(Date.UTC(parseInt(m[3]), parseInt(m[2]) - 1, parseInt(m[1])));
}
return null;
}
function processReasonAndCard(reason) {
if (!reason || typeof reason !== 'string') return { reason: '', card: null };
const parts = reason.trim().split(' ');
let card = null;
let cleanReason = reason.trim();
if (parts[0] && CARD_REGEX.test(parts[0])) {
card = parts[0];
cleanReason = parts.slice(1).join(' ').trim();
}
if (POS_REGEX.test(cleanReason)) {
const posParts = cleanReason.split('<br/>');
try {
const dateTime = posParts[0].split('ПОС ')[1];
cleanReason = `POS PAYMENT ${dateTime}`;
} catch (_) { /* keep original */ }
}
return { reason: cleanReason.replace(/\s+/g, ' ').trim(), card };
}
function generateTags(fields) {
const tags = new Set();
for (const [field, keyword, tagName] of TAG_RULES) {
if ((fields[field] || '').includes(keyword)) {
tags.add(tagName);
}
}
return Array.from(tags);
}
function processRow(row) {
const transactionType = (row[COL.TYPE] || '').trim();
if (transactionType === SKIP_TYPE) return null;
const { reason, card } = processReasonAndCard(row[COL.REASON]);
const payee = (row[COL.PAYEE] || '').trim();
const payerAccount = (row[COL.ACCT] || '').trim();
const debitBgn = parseNum(row[COL.DEBIT]);
const creditBgn = parseNum(row[COL.CREDIT]);
const date = parseDate(row[COL.DATE]);
const autoTags = generateTags({ reason, transactionType, payee, debitBgn, creditBgn });
const amount = debitBgn ?? creditBgn ?? null;
const rawMessage = [
row[COL.DATE] && `Date: ${row[COL.DATE]}`,
transactionType && `Type: ${transactionType}`,
payee && `Payee: ${payee}`,
debitBgn != null && `Debit: ${debitBgn} BGN`,
creditBgn != null && `Credit: ${creditBgn} BGN`,
].filter(Boolean).join(' | ');
return {
rawMessage,
date,
type: null,
card,
recipient: payee || null,
amount,
currency: 'BGN',
balance: null,
source: 'UPLOAD',
debitBgn,
creditBgn,
transactionType: transactionType || null,
payerAccount: payerAccount || null,
autoTags,
};
}
/**
* Parse a Buffer containing a DSK Bank CSV (cp1251 or UTF-8).
* Returns { rows, skipped, errors }.
*/
async function parseDskCsv(buffer) {
// Try cp1251 first (DSK Bank export encoding), fall back to UTF-8
let text = iconv.decode(buffer, 'cp1251');
if (!text.includes(COL.DATE)) {
text = buffer.toString('utf-8');
}
return new Promise((resolve, reject) => {
const rows = [];
const errors = [];
let skipped = 0;
const parser = parse(text, {
columns: true,
skip_empty_lines: true,
trim: true,
relax_column_count: true,
});
parser.on('readable', () => {
let record;
while ((record = parser.read()) !== null) {
try {
const row = processRow(record);
if (row === null) { skipped++; } else { rows.push(row); }
} catch (err) {
errors.push(err.message);
}
}
});
parser.on('error', reject);
parser.on('end', () => resolve({ rows, skipped, errors }));
});
}
module.exports = { parseDskCsv };
Write
index.js
index.js
39 lines
const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const rateLimit = require('express-rate-limit');
const { authentikMiddleware } = require('./auth');
const paymentsRouter = require('./routes/payments');
const uploadRouter = require('./routes/upload');
const app = express();
const PORT = process.env.PORT || 3001;
app.use(cors());
app.use(express.json({ limit: '16kb' }));
app.use(morgan('combined'));
// Rate-limit the public ingest endpoint before auth middleware
const ingestLimiter = rateLimit({
windowMs...
|
11868
|
NULL
|
NULL
|
NULL
|
|
13887
|
620
|
41
|
2026-05-09T16:38:16.035311+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778344696035_m2.jpg...
|
Firefox
|
Providers - Admin - authentik — Personal
|
True
|
auth.lakylak.xyz/if/admin/#/core/providers
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Pull requests · screenpipe/screenpipe · GitHub
Clo Pull requests · screenpipe/screenpipe · GitHub
Close tab
DNS / Nameservers | Hostinger
Close tab
Nginx Proxy Manager
Close tab
Screenpipe — Archive
Close tab
SQLite Web: archive.db
Close tab
SQLite Web: db.sqlite
Close tab
screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub
Close tab
DXP4800PLUS-B5F8
Close tab
AFFiNE - All In One KnowledgeOS
Close tab
All docs · AFFiNE
Close tab
Payments Logger
Close tab
Your old PC can run Windows 11 in a VM, but not on bare metal - [EMAIL] - Gmail
Close tab
Location Logger
Close tab
Finance Hub
Close tab
Finance Hub
Close tab
Select: transactions - db - Adminer
Close tab
Електронно банкиране ДСК Директ от Банка ДСК
Close tab
Stop Losing Notes: Pick A Cross-Device App That Syncs | AFFiNE
Close tab
VIVACOM
Close tab
Смартфони с Unlimited план до 120 € отстъпка | Vivacom
Close tab
VIVACOM
Close tab
Смартфон SAMSUNG GALAXY A57 5G 256GB | Vivacom
Close tab
Claude Code | Claude Platform
Close tab
Claude
Close tab
lakylak/finance-hub - finance-hub - Gitea: Git with a cup of tea
Close tab
Providers - Admin - authentik
Close tab
New Tab
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Customize sidebar
Skip to content
Home
Providers
Provide support for protocols like SAML and OAuth to assigned applications.
Provide support for protocols like SAML and OAuth to assigned applications.
Toggle API requests drawer
Toggle notifications drawer
0
unread
Settings
Sign out
User interface
User interface
Dashboards
Collapse Dashboards
Dashboards
Overview
Overview
User Statistics
User Statistics
System Tasks
System Tasks
Applications
Collapse Applications
Applications
Applications
Applications
Providers
Providers
Outposts
Outposts
Endpoint Devices
Expand Endpoint Devices
Endpoint Devices
Events
Expand Events
Events
Customization
Expand Customization
Customization
Flows and Stages
Expand Flows and Stages
Flows and Stages
Directory
Expand Directory
Directory
System
Expand System
System
Enterprise
Expand Enterprise
Enterprise
Product name
authentik
Product version
Version 2026.2.1
Select all rows on page (0 of 3 selected)
Name
Sort by "Name"
Name
Application
Application
Type
Type
Row Actions
Actions
Select "Reminders Proxy" row
Reminders Proxy
Reminders Proxy
Assigned to application
Reminders
Reminders
Proxy Provider
Edit "Reminders Proxy" provider
Select "open-webui" row
open-webui
open-webui
Assigned to application
Open WebUI
Open WebUI
OAuth2/OpenID Provider
Edit "open-webui" provider
Select "reminders-mcp" row
reminders-mcp
reminders-mcp
Assigned to application
Reminders MCP
Reminders MCP
OAuth2/OpenID Provider
Edit "reminders-mcp" provider
Name
Sort by "Name"
Name
Reminders Proxy
Reminders Proxy
open-webui
open-webui
reminders-mcp
reminders-mcp
Application
Application
Assigned to application
Reminders
Reminders
Assigned to application
Open WebUI
Open WebUI
Assigned to application
Reminders MCP
Reminders MCP
Type
Type
Proxy Provider
OAuth2/OpenID Provider
OAuth2/OpenID Provider
Row Actions
Actions
Edit "Reminders Proxy" provider
Edit "open-webui" provider
Edit "reminders-mcp" provider
Last refreshed
40 seconds ago
1 - 3 of 3
1 - 3 of 3
Go to previous page
Go to next page
Close sidebar...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Pull requests · screenpipe/screenpipe · GitHub","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016123671,"height":0.032721467},"on_screen":false,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.0,"width":0.004986702,"height":0.011971269},"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"DNS / Nameservers | Hostinger","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.0,"width":0.004986702,"height":0.011971269},"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Nginx Proxy Manager","depth":4,"bounds":{"left":0.0,"top":0.028332002,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.028332002,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.0,"top":0.061053474,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.061053474,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SQLite Web: archive.db","depth":4,"bounds":{"left":0.0,"top":0.09377494,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.09377494,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SQLite Web: db.sqlite","depth":4,"bounds":{"left":0.0,"top":0.1264964,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.1264964,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub","depth":4,"bounds":{"left":0.0,"top":0.15921788,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.15921788,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"bounds":{"left":0.0,"top":0.19193934,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.19193934,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"AFFiNE - All In One KnowledgeOS","depth":4,"bounds":{"left":0.0,"top":0.22466081,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.22466081,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"All docs · AFFiNE","depth":4,"bounds":{"left":0.0,"top":0.25738227,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.25738227,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Payments Logger","depth":4,"bounds":{"left":0.0,"top":0.29010376,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.29010376,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Your old PC can run Windows 11 in a VM, but not on bare metal - kovaliklukas@gmail.com - Gmail","depth":4,"bounds":{"left":0.0,"top":0.32282522,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.32282522,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Location Logger","depth":4,"bounds":{"left":0.0,"top":0.35554668,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.35554668,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"bounds":{"left":0.0,"top":0.38826814,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.38826814,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"bounds":{"left":0.0,"top":0.42098963,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.42098963,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Select: transactions - db - Adminer","depth":4,"bounds":{"left":0.0,"top":0.4537111,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.4537111,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Електронно банкиране ДСК Директ от Банка ДСК","depth":4,"bounds":{"left":0.0,"top":0.48643255,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.48643255,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Stop Losing Notes: Pick A Cross-Device App That Syncs | AFFiNE","depth":4,"bounds":{"left":0.0,"top":0.519154,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.519154,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"VIVACOM","depth":4,"bounds":{"left":0.0,"top":0.5518755,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.5518755,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Смартфони с Unlimited план до 120 € отстъпка | Vivacom","depth":4,"bounds":{"left":0.0,"top":0.584597,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.584597,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"VIVACOM","depth":4,"bounds":{"left":0.0,"top":0.61731845,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.61731845,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Смартфон SAMSUNG GALAXY A57 5G 256GB | Vivacom","depth":4,"bounds":{"left":0.0,"top":0.6500399,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.6500399,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Claude Code | Claude Platform","depth":4,"bounds":{"left":0.0,"top":0.6827614,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.6827614,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Claude","depth":4,"bounds":{"left":0.0,"top":0.71548283,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.71548283,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"lakylak/finance-hub - finance-hub - Gitea: Git with a cup of tea","depth":4,"bounds":{"left":0.0,"top":0.7482043,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.7482043,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Providers - Admin - authentik","depth":4,"bounds":{"left":0.0,"top":0.78092575,"width":0.016123671,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0006648936,"top":0.78092575,"width":0.004986702,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.81803674,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.0,"top":0.8547486,"width":0.016123671,"height":0.0311253},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.0,"top":0.8858739,"width":0.016123671,"height":0.027533919},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.0,"top":0.9134078,"width":0.016123671,"height":0.02793296},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.0,"top":0.9413408,"width":0.016123671,"height":0.027533919},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.9688747,"width":0.016123671,"height":0.0311253},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Skip to content","depth":6,"bounds":{"left":0.016123671,"top":0.0518755,"width":0.0003324468,"height":0.0007980846},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Home","depth":8,"bounds":{"left":0.025099734,"top":0.08539505,"width":0.078457445,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Providers","depth":10,"bounds":{"left":0.13547207,"top":0.075019956,"width":0.03474069,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Provide support for protocols like SAML and OAuth to assigned applications.","depth":8,"bounds":{"left":0.123171546,"top":0.1009577,"width":0.2330452,"height":0.033519555},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide support for protocols like SAML and OAuth to assigned applications.","depth":10,"bounds":{"left":0.123171546,"top":0.10574621,"width":0.18018617,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle API requests drawer","depth":10,"bounds":{"left":0.3615359,"top":0.08539505,"width":0.017287234,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Toggle notifications drawer","depth":10,"bounds":{"left":0.37882313,"top":0.08539505,"width":0.02144282,"height":0.028731046},"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":13,"bounds":{"left":0.39145613,"top":0.09098165,"width":0.0034906915,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"unread","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":10,"bounds":{"left":0.40026596,"top":0.08539505,"width":0.015957447,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Sign out","depth":10,"bounds":{"left":0.4162234,"top":0.08539505,"width":0.015957447,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"User interface","depth":9,"bounds":{"left":0.43218085,"top":0.086592175,"width":0.039893616,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User interface","depth":10,"bounds":{"left":0.4375,"top":0.09217877,"width":0.02925532,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Dashboards","depth":8,"bounds":{"left":0.017121011,"top":0.15403032,"width":0.09541223,"height":0.1300878},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Dashboards","depth":9,"bounds":{"left":0.017121011,"top":0.15403032,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Dashboards","depth":10,"bounds":{"left":0.02244016,"top":0.16161214,"width":0.02825798,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Overview","depth":12,"bounds":{"left":0.023603724,"top":0.18914606,"width":0.08892952,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Overview","depth":13,"bounds":{"left":0.028922873,"top":0.1963288,"width":0.019448139,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"User Statistics","depth":12,"bounds":{"left":0.023603724,"top":0.21867518,"width":0.08892952,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User Statistics","depth":13,"bounds":{"left":0.028922873,"top":0.22585794,"width":0.029920213,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"System Tasks","depth":12,"bounds":{"left":0.023603724,"top":0.2482043,"width":0.08892952,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"System Tasks","depth":13,"bounds":{"left":0.028922873,"top":0.25538707,"width":0.027759308,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Applications","depth":8,"bounds":{"left":0.017121011,"top":0.28411812,"width":0.09541223,"height":0.1300878},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Applications","depth":9,"bounds":{"left":0.017121011,"top":0.28411812,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Applications","depth":10,"bounds":{"left":0.02244016,"top":0.29169992,"width":0.02925532,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Applications","depth":12,"bounds":{"left":0.023603724,"top":0.31923383,"width":0.08892952,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Applications","depth":13,"bounds":{"left":0.028922873,"top":0.3264166,"width":0.02543218,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Providers","depth":12,"bounds":{"left":0.023603724,"top":0.34876296,"width":0.08892952,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Providers","depth":13,"bounds":{"left":0.028922873,"top":0.35594574,"width":0.019448139,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Outposts","depth":12,"bounds":{"left":0.023603724,"top":0.3782921,"width":0.08892952,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Outposts","depth":13,"bounds":{"left":0.028922873,"top":0.38547486,"width":0.019448139,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Endpoint Devices","depth":8,"bounds":{"left":0.017121011,"top":0.4142059,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Endpoint Devices","depth":9,"bounds":{"left":0.017121011,"top":0.4142059,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Endpoint Devices","depth":10,"bounds":{"left":0.02244016,"top":0.4217877,"width":0.04155585,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Events","depth":8,"bounds":{"left":0.017121011,"top":0.44932163,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Events","depth":9,"bounds":{"left":0.017121011,"top":0.44932163,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Events","depth":10,"bounds":{"left":0.02244016,"top":0.45690343,"width":0.016123671,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Customization","depth":8,"bounds":{"left":0.017121011,"top":0.48443735,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Customization","depth":9,"bounds":{"left":0.017121011,"top":0.48443735,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Customization","depth":10,"bounds":{"left":0.02244016,"top":0.49201915,"width":0.034242023,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Flows and Stages","depth":8,"bounds":{"left":0.017121011,"top":0.51955307,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Flows and Stages","depth":9,"bounds":{"left":0.017121011,"top":0.51955307,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Flows and Stages","depth":10,"bounds":{"left":0.02244016,"top":0.5271349,"width":0.04138963,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Directory","depth":8,"bounds":{"left":0.017121011,"top":0.5546688,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Directory","depth":9,"bounds":{"left":0.017121011,"top":0.5546688,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Directory","depth":10,"bounds":{"left":0.02244016,"top":0.5622506,"width":0.022107713,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"System","depth":8,"bounds":{"left":0.017121011,"top":0.5897845,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand System","depth":9,"bounds":{"left":0.017121011,"top":0.5897845,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"System","depth":10,"bounds":{"left":0.02244016,"top":0.59736633,"width":0.017785905,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Enterprise","depth":8,"bounds":{"left":0.017121011,"top":0.6249002,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Enterprise","depth":9,"bounds":{"left":0.017121011,"top":0.6249002,"width":0.09541223,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Enterprise","depth":10,"bounds":{"left":0.02244016,"top":0.63248205,"width":0.024601065,"height":0.01715882},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Product name","depth":8,"bounds":{"left":0.026761968,"top":0.9537111,"width":0.07513298,"height":0.014365523},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"authentik","depth":9,"bounds":{"left":0.056017287,"top":0.9545092,"width":0.01662234,"height":0.0131683955},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Product version","depth":8,"bounds":{"left":0.026761968,"top":0.9680766,"width":0.07513298,"height":0.014365523},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Version 2026.2.1","depth":9,"bounds":{"left":0.050033245,"top":0.9688747,"width":0.028590426,"height":0.0131683955},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Select all rows on page (0 of 3 selected)","depth":14,"bounds":{"left":0.12849069,"top":0.23463687,"width":0.004654255,"height":0.011173184},"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCell","text":"Name","depth":13,"bounds":{"left":0.13646941,"top":0.22106944,"width":0.06582447,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXButton","text":"Sort by \"Name\"","depth":14,"bounds":{"left":0.13646941,"top":0.22825219,"width":0.026263298,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Name","depth":16,"bounds":{"left":0.13912898,"top":0.23383878,"width":0.013297873,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Application","depth":13,"bounds":{"left":0.20229389,"top":0.22106944,"width":0.15442154,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Application","depth":14,"bounds":{"left":0.20495346,"top":0.23383878,"width":0.026097074,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Type","depth":13,"bounds":{"left":0.3567154,"top":0.22106944,"width":0.09541223,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":14,"bounds":{"left":0.359375,"top":0.23383878,"width":0.011136968,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Row Actions","depth":13,"bounds":{"left":0.45212767,"top":0.22106944,"width":0.039893616,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Actions","depth":14,"bounds":{"left":0.45478722,"top":0.23383878,"width":0.017287234,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Select \"Reminders Proxy\" row","depth":13,"bounds":{"left":0.12849069,"top":0.27214685,"width":0.004654255,"height":0.011173184},"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Reminders Proxy","depth":13,"bounds":{"left":0.13912898,"top":0.27094972,"width":0.03474069,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders Proxy","depth":14,"bounds":{"left":0.13912898,"top":0.27094972,"width":0.03474069,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"bounds":{"left":0.21060506,"top":0.27094972,"width":0.049534574,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders","depth":13,"bounds":{"left":0.2601396,"top":0.27094972,"width":0.021941489,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders","depth":14,"bounds":{"left":0.2601396,"top":0.27094972,"width":0.021941489,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Proxy Provider","depth":13,"bounds":{"left":0.359375,"top":0.27094972,"width":0.030086435,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"Reminders Proxy\" provider","depth":14,"bounds":{"left":0.45478722,"top":0.26336792,"width":0.011303191,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Select \"open-webui\" row","depth":13,"bounds":{"left":0.12849069,"top":0.31444532,"width":0.004654255,"height":0.011173184},"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"open-webui","depth":13,"bounds":{"left":0.13912898,"top":0.31324822,"width":0.024767287,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"open-webui","depth":14,"bounds":{"left":0.13912898,"top":0.31324822,"width":0.024767287,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"bounds":{"left":0.21060506,"top":0.31324822,"width":0.049534574,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Open WebUI","depth":13,"bounds":{"left":0.2601396,"top":0.31324822,"width":0.02642952,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Open WebUI","depth":14,"bounds":{"left":0.2601396,"top":0.31324822,"width":0.02642952,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"bounds":{"left":0.359375,"top":0.31324822,"width":0.05285904,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"open-webui\" provider","depth":14,"bounds":{"left":0.45478722,"top":0.3056664,"width":0.011303191,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Select \"reminders-mcp\" row","depth":13,"bounds":{"left":0.12849069,"top":0.3567438,"width":0.004654255,"height":0.011173184},"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"reminders-mcp","depth":13,"bounds":{"left":0.13912898,"top":0.35554668,"width":0.03174867,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"reminders-mcp","depth":14,"bounds":{"left":0.13912898,"top":0.35554668,"width":0.03174867,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"bounds":{"left":0.21060506,"top":0.35554668,"width":0.049534574,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders MCP","depth":13,"bounds":{"left":0.2601396,"top":0.35554668,"width":0.033410903,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders MCP","depth":14,"bounds":{"left":0.2601396,"top":0.35554668,"width":0.033410903,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"bounds":{"left":0.359375,"top":0.35554668,"width":0.05285904,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"reminders-mcp\" provider","depth":14,"bounds":{"left":0.45478722,"top":0.34796488,"width":0.011303191,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCell","text":"Name","depth":12,"bounds":{"left":0.13646941,"top":0.22106944,"width":0.06582447,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXButton","text":"Sort by \"Name\"","depth":13,"bounds":{"left":0.13646941,"top":0.22825219,"width":0.026263298,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Name","depth":15,"bounds":{"left":0.13912898,"top":0.23383878,"width":0.013297873,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders Proxy","depth":13,"bounds":{"left":0.13912898,"top":0.27094972,"width":0.03474069,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders Proxy","depth":14,"bounds":{"left":0.13912898,"top":0.27094972,"width":0.03474069,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"open-webui","depth":13,"bounds":{"left":0.13912898,"top":0.31324822,"width":0.024767287,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"open-webui","depth":14,"bounds":{"left":0.13912898,"top":0.31324822,"width":0.024767287,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"reminders-mcp","depth":13,"bounds":{"left":0.13912898,"top":0.35554668,"width":0.03174867,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"reminders-mcp","depth":14,"bounds":{"left":0.13912898,"top":0.35554668,"width":0.03174867,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Application","depth":12,"bounds":{"left":0.20229389,"top":0.22106944,"width":0.15442154,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Application","depth":13,"bounds":{"left":0.20495346,"top":0.23383878,"width":0.026097074,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"bounds":{"left":0.21060506,"top":0.27094972,"width":0.049534574,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders","depth":13,"bounds":{"left":0.2601396,"top":0.27094972,"width":0.021941489,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders","depth":14,"bounds":{"left":0.2601396,"top":0.27094972,"width":0.021941489,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"bounds":{"left":0.21060506,"top":0.31324822,"width":0.049534574,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Open WebUI","depth":13,"bounds":{"left":0.2601396,"top":0.31324822,"width":0.02642952,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Open WebUI","depth":14,"bounds":{"left":0.2601396,"top":0.31324822,"width":0.02642952,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"bounds":{"left":0.21060506,"top":0.35554668,"width":0.049534574,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders MCP","depth":13,"bounds":{"left":0.2601396,"top":0.35554668,"width":0.033410903,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders MCP","depth":14,"bounds":{"left":0.2601396,"top":0.35554668,"width":0.033410903,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Type","depth":12,"bounds":{"left":0.3567154,"top":0.22106944,"width":0.09541223,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":13,"bounds":{"left":0.359375,"top":0.23383878,"width":0.011136968,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Proxy Provider","depth":13,"bounds":{"left":0.359375,"top":0.27094972,"width":0.030086435,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"bounds":{"left":0.359375,"top":0.31324822,"width":0.05285904,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"bounds":{"left":0.359375,"top":0.35554668,"width":0.05285904,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Row Actions","depth":12,"bounds":{"left":0.45212767,"top":0.22106944,"width":0.039893616,"height":0.035514764},"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Actions","depth":13,"bounds":{"left":0.45478722,"top":0.23383878,"width":0.017287234,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"Reminders Proxy\" provider","depth":14,"bounds":{"left":0.45478722,"top":0.26336792,"width":0.011303191,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit \"open-webui\" provider","depth":14,"bounds":{"left":0.45478722,"top":0.3056664,"width":0.011303191,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit \"reminders-mcp\" provider","depth":14,"bounds":{"left":0.45478722,"top":0.34796488,"width":0.011303191,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Last refreshed","depth":13,"bounds":{"left":0.12849069,"top":0.4046289,"width":0.025265958,"height":0.0131683955},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"40 seconds ago","depth":13,"bounds":{"left":0.15475398,"top":0.4046289,"width":0.027759308,"height":0.0131683955},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1 - 3 of 3","depth":13,"bounds":{"left":0.4424867,"top":0.40343177,"width":0.01761968,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1 - 3 of 3","depth":14,"bounds":{"left":0.4424867,"top":0.40343177,"width":0.01761968,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Go to previous page","depth":13,"bounds":{"left":0.46276596,"top":0.39664805,"width":0.007978723,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Go to next page","depth":13,"bounds":{"left":0.47606382,"top":0.39664805,"width":0.007978723,"height":0.028731046},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close sidebar","depth":6,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
3365553330526379996
|
-5042042045573917557
|
click
|
accessibility
|
NULL
|
Pull requests · screenpipe/screenpipe · GitHub
Clo Pull requests · screenpipe/screenpipe · GitHub
Close tab
DNS / Nameservers | Hostinger
Close tab
Nginx Proxy Manager
Close tab
Screenpipe — Archive
Close tab
SQLite Web: archive.db
Close tab
SQLite Web: db.sqlite
Close tab
screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub
Close tab
DXP4800PLUS-B5F8
Close tab
AFFiNE - All In One KnowledgeOS
Close tab
All docs · AFFiNE
Close tab
Payments Logger
Close tab
Your old PC can run Windows 11 in a VM, but not on bare metal - [EMAIL] - Gmail
Close tab
Location Logger
Close tab
Finance Hub
Close tab
Finance Hub
Close tab
Select: transactions - db - Adminer
Close tab
Електронно банкиране ДСК Директ от Банка ДСК
Close tab
Stop Losing Notes: Pick A Cross-Device App That Syncs | AFFiNE
Close tab
VIVACOM
Close tab
Смартфони с Unlimited план до 120 € отстъпка | Vivacom
Close tab
VIVACOM
Close tab
Смартфон SAMSUNG GALAXY A57 5G 256GB | Vivacom
Close tab
Claude Code | Claude Platform
Close tab
Claude
Close tab
lakylak/finance-hub - finance-hub - Gitea: Git with a cup of tea
Close tab
Providers - Admin - authentik
Close tab
New Tab
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Customize sidebar
Skip to content
Home
Providers
Provide support for protocols like SAML and OAuth to assigned applications.
Provide support for protocols like SAML and OAuth to assigned applications.
Toggle API requests drawer
Toggle notifications drawer
0
unread
Settings
Sign out
User interface
User interface
Dashboards
Collapse Dashboards
Dashboards
Overview
Overview
User Statistics
User Statistics
System Tasks
System Tasks
Applications
Collapse Applications
Applications
Applications
Applications
Providers
Providers
Outposts
Outposts
Endpoint Devices
Expand Endpoint Devices
Endpoint Devices
Events
Expand Events
Events
Customization
Expand Customization
Customization
Flows and Stages
Expand Flows and Stages
Flows and Stages
Directory
Expand Directory
Directory
System
Expand System
System
Enterprise
Expand Enterprise
Enterprise
Product name
authentik
Product version
Version 2026.2.1
Select all rows on page (0 of 3 selected)
Name
Sort by "Name"
Name
Application
Application
Type
Type
Row Actions
Actions
Select "Reminders Proxy" row
Reminders Proxy
Reminders Proxy
Assigned to application
Reminders
Reminders
Proxy Provider
Edit "Reminders Proxy" provider
Select "open-webui" row
open-webui
open-webui
Assigned to application
Open WebUI
Open WebUI
OAuth2/OpenID Provider
Edit "open-webui" provider
Select "reminders-mcp" row
reminders-mcp
reminders-mcp
Assigned to application
Reminders MCP
Reminders MCP
OAuth2/OpenID Provider
Edit "reminders-mcp" provider
Name
Sort by "Name"
Name
Reminders Proxy
Reminders Proxy
open-webui
open-webui
reminders-mcp
reminders-mcp
Application
Application
Assigned to application
Reminders
Reminders
Assigned to application
Open WebUI
Open WebUI
Assigned to application
Reminders MCP
Reminders MCP
Type
Type
Proxy Provider
OAuth2/OpenID Provider
OAuth2/OpenID Provider
Row Actions
Actions
Edit "Reminders Proxy" provider
Edit "open-webui" provider
Edit "reminders-mcp" provider
Last refreshed
40 seconds ago
1 - 3 of 3
1 - 3 of 3
Go to previous page
Go to next page
Close sidebar...
|
13884
|
NULL
|
NULL
|
NULL
|
|
13896
|
619
|
41
|
2026-05-09T16:39:00.869732+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778344740869_m1.jpg...
|
Firefox
|
Providers - Admin - authentik — Personal
|
True
|
auth.lakylak.xyz/if/admin/#/core/providers
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Pull requests · screenpipe/screenpipe · GitHub
Clo Pull requests · screenpipe/screenpipe · GitHub
Close tab
DNS / Nameservers | Hostinger
Close tab
Nginx Proxy Manager
Close tab
Screenpipe — Archive
Close tab
SQLite Web: archive.db
Close tab
SQLite Web: db.sqlite
Close tab
screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub
Close tab
DXP4800PLUS-B5F8
Close tab
AFFiNE - All In One KnowledgeOS
Close tab
All docs · AFFiNE
Close tab
Payments Logger
Close tab
Your old PC can run Windows 11 in a VM, but not on bare metal - [EMAIL] - Gmail
Close tab
Location Logger
Close tab
Finance Hub
Close tab
Finance Hub
Close tab
Select: transactions - db - Adminer
Close tab
Електронно банкиране ДСК Директ от Банка ДСК
Close tab
Stop Losing Notes: Pick A Cross-Device App That Syncs | AFFiNE
Close tab
VIVACOM
Close tab
Смартфони с Unlimited план до 120 € отстъпка | Vivacom
Close tab
VIVACOM
Close tab
Смартфон SAMSUNG GALAXY A57 5G 256GB | Vivacom
Close tab
Claude Code | Claude Platform
Close tab
Claude
Close tab
lakylak/finance-hub - finance-hub - Gitea: Git with a cup of tea
Close tab
Providers - Admin - authentik
Close tab
New Tab
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Customize sidebar
Skip to content
Home
Providers
Provide support for protocols like SAML and OAuth to assigned applications.
Provide support for protocols like SAML and OAuth to assigned applications.
Toggle API requests drawer
Toggle notifications drawer
0
unread
Settings
Sign out
User interface
User interface
Dashboards
Collapse Dashboards
Dashboards
Overview
Overview
User Statistics
User Statistics
System Tasks
System Tasks
Applications
Collapse Applications
Applications
Applications
Applications
Providers
Providers
Outposts
Outposts
Endpoint Devices
Expand Endpoint Devices
Endpoint Devices
Events
Expand Events
Events
Customization
Expand Customization
Customization
Flows and Stages
Expand Flows and Stages
Flows and Stages
Directory
Expand Directory
Directory
System
Expand System
System
Enterprise
Expand Enterprise
Enterprise
Product name
authentik
Product version
Version 2026.2.1
Select all rows on page (0 of 3 selected)
Name
Sort by "Name"
Name
Application
Application
Type
Type
Row Actions
Actions
Select "Reminders Proxy" row
Reminders Proxy
Reminders Proxy
Assigned to application
Reminders
Reminders
Proxy Provider
Edit "Reminders Proxy" provider
Select "open-webui" row
open-webui
open-webui
Assigned to application
Open WebUI
Open WebUI
OAuth2/OpenID Provider
Edit "open-webui" provider
Select "reminders-mcp" row
reminders-mcp
reminders-mcp
Assigned to application
Reminders MCP
Reminders MCP
OAuth2/OpenID Provider
Edit "reminders-mcp" provider
Name
Sort by "Name"
Name
Reminders Proxy
Reminders Proxy
open-webui
open-webui
reminders-mcp
reminders-mcp
Application
Application
Assigned to application
Reminders
Reminders
Assigned to application
Open WebUI
Open WebUI
Assigned to application
Reminders MCP
Reminders MCP
Type
Type
Proxy Provider
OAuth2/OpenID Provider
OAuth2/OpenID Provider
Row Actions
Actions
Edit "Reminders Proxy" provider
Edit "open-webui" provider
Edit "reminders-mcp" provider
Last refreshed
1 minute ago
1 - 3 of 3
1 - 3 of 3
Go to previous page
Go to next page
Close sidebar...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Pull requests · screenpipe/screenpipe · GitHub","depth":4,"on_screen":false,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"DNS / Nameservers | Hostinger","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Nginx Proxy Manager","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SQLite Web: archive.db","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SQLite Web: db.sqlite","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"AFFiNE - All In One KnowledgeOS","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"All docs · AFFiNE","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Payments Logger","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Your old PC can run Windows 11 in a VM, but not on bare metal - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Location Logger","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Select: transactions - db - Adminer","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Електронно банкиране ДСК Директ от Банка ДСК","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Stop Losing Notes: Pick A Cross-Device App That Syncs | AFFiNE","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"VIVACOM","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Смартфони с Unlimited план до 120 € отстъпка | Vivacom","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"VIVACOM","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Смартфон SAMSUNG GALAXY A57 5G 256GB | Vivacom","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Claude Code | Claude Platform","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Claude","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"lakylak/finance-hub - finance-hub - Gitea: Git with a cup of tea","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Providers - Admin - authentik","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Skip to content","depth":6,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Home","depth":8,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Providers","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Provide support for protocols like SAML and OAuth to assigned applications.","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Provide support for protocols like SAML and OAuth to assigned applications.","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Toggle API requests drawer","depth":10,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Toggle notifications drawer","depth":10,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"unread","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":10,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Sign out","depth":10,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"User interface","depth":9,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User interface","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Dashboards","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Dashboards","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Dashboards","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Overview","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Overview","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"User Statistics","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"User Statistics","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"System Tasks","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"System Tasks","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Applications","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse Applications","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Applications","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Applications","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Applications","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Providers","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Providers","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Outposts","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Outposts","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Endpoint Devices","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Endpoint Devices","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Endpoint Devices","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Events","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Events","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Events","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Customization","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Customization","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Customization","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Flows and Stages","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Flows and Stages","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Flows and Stages","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Directory","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Directory","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Directory","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"System","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand System","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"System","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Enterprise","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand Enterprise","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Enterprise","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Product name","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"authentik","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Product version","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Version 2026.2.1","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Select all rows on page (0 of 3 selected)","depth":14,"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCell","text":"Name","depth":13,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXButton","text":"Sort by \"Name\"","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Name","depth":16,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Application","depth":13,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Application","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Type","depth":13,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Row Actions","depth":13,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Actions","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Select \"Reminders Proxy\" row","depth":13,"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Reminders Proxy","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders Proxy","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Proxy Provider","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"Reminders Proxy\" provider","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Select \"open-webui\" row","depth":13,"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"open-webui","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"open-webui","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Open WebUI","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Open WebUI","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"open-webui\" provider","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Select \"reminders-mcp\" row","depth":13,"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"reminders-mcp","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"reminders-mcp","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders MCP","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders MCP","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"reminders-mcp\" provider","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCell","text":"Name","depth":12,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXButton","text":"Sort by \"Name\"","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Name","depth":15,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders Proxy","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders Proxy","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"open-webui","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"open-webui","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"reminders-mcp","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"reminders-mcp","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Application","depth":12,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Open WebUI","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Open WebUI","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Assigned to application","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Reminders MCP","depth":13,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Reminders MCP","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Type","depth":12,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Proxy Provider","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"OAuth2/OpenID Provider","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCell","text":"Row Actions","depth":12,"on_screen":true,"help_text":"","role_description":"cell","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Actions","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit \"Reminders Proxy\" provider","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit \"open-webui\" provider","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit \"reminders-mcp\" provider","depth":14,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Last refreshed","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1 minute ago","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1 - 3 of 3","depth":13,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1 - 3 of 3","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Go to previous page","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Go to next page","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Close sidebar","depth":6,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-1406012524373728418
|
-5042042045573917557
|
click
|
accessibility
|
NULL
|
Pull requests · screenpipe/screenpipe · GitHub
Clo Pull requests · screenpipe/screenpipe · GitHub
Close tab
DNS / Nameservers | Hostinger
Close tab
Nginx Proxy Manager
Close tab
Screenpipe — Archive
Close tab
SQLite Web: archive.db
Close tab
SQLite Web: db.sqlite
Close tab
screenpipe/.claude/skills at main · screenpipe/screenpipe · GitHub
Close tab
DXP4800PLUS-B5F8
Close tab
AFFiNE - All In One KnowledgeOS
Close tab
All docs · AFFiNE
Close tab
Payments Logger
Close tab
Your old PC can run Windows 11 in a VM, but not on bare metal - [EMAIL] - Gmail
Close tab
Location Logger
Close tab
Finance Hub
Close tab
Finance Hub
Close tab
Select: transactions - db - Adminer
Close tab
Електронно банкиране ДСК Директ от Банка ДСК
Close tab
Stop Losing Notes: Pick A Cross-Device App That Syncs | AFFiNE
Close tab
VIVACOM
Close tab
Смартфони с Unlimited план до 120 € отстъпка | Vivacom
Close tab
VIVACOM
Close tab
Смартфон SAMSUNG GALAXY A57 5G 256GB | Vivacom
Close tab
Claude Code | Claude Platform
Close tab
Claude
Close tab
lakylak/finance-hub - finance-hub - Gitea: Git with a cup of tea
Close tab
Providers - Admin - authentik
Close tab
New Tab
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Customize sidebar
Skip to content
Home
Providers
Provide support for protocols like SAML and OAuth to assigned applications.
Provide support for protocols like SAML and OAuth to assigned applications.
Toggle API requests drawer
Toggle notifications drawer
0
unread
Settings
Sign out
User interface
User interface
Dashboards
Collapse Dashboards
Dashboards
Overview
Overview
User Statistics
User Statistics
System Tasks
System Tasks
Applications
Collapse Applications
Applications
Applications
Applications
Providers
Providers
Outposts
Outposts
Endpoint Devices
Expand Endpoint Devices
Endpoint Devices
Events
Expand Events
Events
Customization
Expand Customization
Customization
Flows and Stages
Expand Flows and Stages
Flows and Stages
Directory
Expand Directory
Directory
System
Expand System
System
Enterprise
Expand Enterprise
Enterprise
Product name
authentik
Product version
Version 2026.2.1
Select all rows on page (0 of 3 selected)
Name
Sort by "Name"
Name
Application
Application
Type
Type
Row Actions
Actions
Select "Reminders Proxy" row
Reminders Proxy
Reminders Proxy
Assigned to application
Reminders
Reminders
Proxy Provider
Edit "Reminders Proxy" provider
Select "open-webui" row
open-webui
open-webui
Assigned to application
Open WebUI
Open WebUI
OAuth2/OpenID Provider
Edit "open-webui" provider
Select "reminders-mcp" row
reminders-mcp
reminders-mcp
Assigned to application
Reminders MCP
Reminders MCP
OAuth2/OpenID Provider
Edit "reminders-mcp" provider
Name
Sort by "Name"
Name
Reminders Proxy
Reminders Proxy
open-webui
open-webui
reminders-mcp
reminders-mcp
Application
Application
Assigned to application
Reminders
Reminders
Assigned to application
Open WebUI
Open WebUI
Assigned to application
Reminders MCP
Reminders MCP
Type
Type
Proxy Provider
OAuth2/OpenID Provider
OAuth2/OpenID Provider
Row Actions
Actions
Edit "Reminders Proxy" provider
Edit "open-webui" provider
Edit "reminders-mcp" provider
Last refreshed
1 minute ago
1 - 3 of 3
1 - 3 of 3
Go to previous page
Go to next page
Close sidebar...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14184
|
630
|
41
|
2026-05-09T17:03:31.232013+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778346211232_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
0413\u0418\u042f | Debit: 0.09 EUR",
0413\u0418\u042f | Debit: 0.09 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u0415\u041b\u0415\u041a\u0422P\u041e\u0425\u041e\u041b\u0414\u041fP\u041e\u0414\u0410\u0416\u0411\u0418/\u0414\u0421\u041a\u0414\u0418\u0420\u0415\u041a\u0422/\u0415\u041b.\u0415\u041d\u0415\u0420\u0413\u0418\u042f",
"amount": 0.09,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 0.09,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
},
{
"rawMessage": "Date: 04.05.2026 | Type: \u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418 | Payee: \u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422 | Debit: 29.54 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422",
"amount": 29.54,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 29.54,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
}
],
"total": 10,
"skipped": 0,
"errors": []
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w "%{http_code}" [URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
[URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
"https://finance-hub.lakylak.xyz/api/payments?limit=1"
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>openresty</center>
</body>
</html>
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"0413\\u0418\\u042f | Debit: 0.09 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u0415\\u041b\\u0415\\u041a\\u0422P\\u041e\\u0425\\u041e\\u041b\\u0414\\u041fP\\u041e\\u0414\\u0410\\u0416\\u0411\\u0418/\\u0414\\u0421\\u041a\\u0414\\u0418\\u0420\\u0415\\u041a\\u0422/\\u0415\\u041b.\\u0415\\u041d\\u0415\\u0420\\u0413\\u0418\\u042f\",\n \"amount\": 0.09,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 0.09,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG15STSA93000004594031\",\n \"autoTags\": [\n \"Bills\"\n ]\n },\n {\n \"rawMessage\": \"Date: 04.05.2026 | Type: \\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418 | Payee: \\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422 | Debit: 29.54 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422\",\n \"amount\": 29.54,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 29.54,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG03STSA93000045940400\",\n \"autoTags\": [\n \"Bills\"\n ]\n }\n ],\n \"total\": 10,\n \"skipped\": 0,\n \"errors\": []\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w \"%{http_code}\" https://finance-hub.lakylak.xyz/api/payments\n302% \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s https://finance-hub.lakylak.xyz/api/health\n{\"status\":\"ok\",\"timestamp\":\"2026-05-09T16:43:04.504Z\",\"storage\":{\"type\":\"PostgreSQL\",\"host\":\"db\",\"database\":\"finance_hub\"}}% lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n https://finance-hub.lakylak.xyz/api/payments?limit=1 | head -50\nzsh: no matches found: https://finance-hub.lakylak.xyz/api/payments?limit=1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n \"https://finance-hub.lakylak.xyz/api/payments?limit=1\"\n\n<html>\n<head><title>302 Found</title></head>\n<body>\n<center><h1>302 Found</h1></center>\n<hr><center>openresty</center>\n</body>\n</html>\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $","depth":4,"bounds":{"left":0.2699468,"top":0.4309657,"width":0.4787234,"height":0.56903434},"on_screen":true,"value":"0413\\u0418\\u042f | Debit: 0.09 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u0415\\u041b\\u0415\\u041a\\u0422P\\u041e\\u0425\\u041e\\u041b\\u0414\\u041fP\\u041e\\u0414\\u0410\\u0416\\u0411\\u0418/\\u0414\\u0421\\u041a\\u0414\\u0418\\u0420\\u0415\\u041a\\u0422/\\u0415\\u041b.\\u0415\\u041d\\u0415\\u0420\\u0413\\u0418\\u042f\",\n \"amount\": 0.09,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 0.09,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG15STSA93000004594031\",\n \"autoTags\": [\n \"Bills\"\n ]\n },\n {\n \"rawMessage\": \"Date: 04.05.2026 | Type: \\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418 | Payee: \\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422 | Debit: 29.54 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422\",\n \"amount\": 29.54,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 29.54,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG03STSA93000045940400\",\n \"autoTags\": [\n \"Bills\"\n ]\n }\n ],\n \"total\": 10,\n \"skipped\": 0,\n \"errors\": []\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w \"%{http_code}\" https://finance-hub.lakylak.xyz/api/payments\n302% \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s https://finance-hub.lakylak.xyz/api/health\n{\"status\":\"ok\",\"timestamp\":\"2026-05-09T16:43:04.504Z\",\"storage\":{\"type\":\"PostgreSQL\",\"host\":\"db\",\"database\":\"finance_hub\"}}% lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n https://finance-hub.lakylak.xyz/api/payments?limit=1 | head -50\nzsh: no matches found: https://finance-hub.lakylak.xyz/api/payments?limit=1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n \"https://finance-hub.lakylak.xyz/api/payments?limit=1\"\n\n<html>\n<head><title>302 Found</title></head>\n<body>\n<center><h1>302 Found</h1></center>\n<hr><center>openresty</center>\n</body>\n</html>\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.2699468,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27194148,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.33726728,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33926198,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.40458778,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.40658244,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.47190824,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4739029,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.53922874,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5412234,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.60638297,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.60837764,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.67353725,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6755319,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.72706115,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.5036569,"top":1.0,"width":0.010970744,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-6410618381606808316
|
912713862244731333
|
click
|
accessibility
|
NULL
|
0413\u0418\u042f | Debit: 0.09 EUR",
0413\u0418\u042f | Debit: 0.09 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u0415\u041b\u0415\u041a\u0422P\u041e\u0425\u041e\u041b\u0414\u041fP\u041e\u0414\u0410\u0416\u0411\u0418/\u0414\u0421\u041a\u0414\u0418\u0420\u0415\u041a\u0422/\u0415\u041b.\u0415\u041d\u0415\u0420\u0413\u0418\u042f",
"amount": 0.09,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 0.09,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
},
{
"rawMessage": "Date: 04.05.2026 | Type: \u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418 | Payee: \u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422 | Debit: 29.54 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422",
"amount": 29.54,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 29.54,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
}
],
"total": 10,
"skipped": 0,
"errors": []
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w "%{http_code}" [URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
[URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
"https://finance-hub.lakylak.xyz/api/payments?limit=1"
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>openresty</center>
</body>
</html>
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14187
|
629
|
41
|
2026-05-09T17:03:37.617363+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778346217617_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
0413\u0418\u042f | Debit: 0.09 EUR",
0413\u0418\u042f | Debit: 0.09 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u0415\u041b\u0415\u041a\u0422P\u041e\u0425\u041e\u041b\u0414\u041fP\u041e\u0414\u0410\u0416\u0411\u0418/\u0414\u0421\u041a\u0414\u0418\u0420\u0415\u041a\u0422/\u0415\u041b.\u0415\u041d\u0415\u0420\u0413\u0418\u042f",
"amount": 0.09,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 0.09,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
},
{
"rawMessage": "Date: 04.05.2026 | Type: \u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418 | Payee: \u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422 | Debit: 29.54 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422",
"amount": 29.54,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 29.54,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
}
],
"total": 10,
"skipped": 0,
"errors": []
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w "%{http_code}" [URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
[URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
"[URL_WITH_CREDENTIALS] ~/Downloads $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"0413\\u0418\\u042f | Debit: 0.09 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u0415\\u041b\\u0415\\u041a\\u0422P\\u041e\\u0425\\u041e\\u041b\\u0414\\u041fP\\u041e\\u0414\\u0410\\u0416\\u0411\\u0418/\\u0414\\u0421\\u041a\\u0414\\u0418\\u0420\\u0415\\u041a\\u0422/\\u0415\\u041b.\\u0415\\u041d\\u0415\\u0420\\u0413\\u0418\\u042f\",\n \"amount\": 0.09,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 0.09,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG15STSA93000004594031\",\n \"autoTags\": [\n \"Bills\"\n ]\n },\n {\n \"rawMessage\": \"Date: 04.05.2026 | Type: \\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418 | Payee: \\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422 | Debit: 29.54 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422\",\n \"amount\": 29.54,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 29.54,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG03STSA93000045940400\",\n \"autoTags\": [\n \"Bills\"\n ]\n }\n ],\n \"total\": 10,\n \"skipped\": 0,\n \"errors\": []\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w \"%{http_code}\" https://finance-hub.lakylak.xyz/api/payments\n302% \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s https://finance-hub.lakylak.xyz/api/health\n{\"status\":\"ok\",\"timestamp\":\"2026-05-09T16:43:04.504Z\",\"storage\":{\"type\":\"PostgreSQL\",\"host\":\"db\",\"database\":\"finance_hub\"}}% lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n https://finance-hub.lakylak.xyz/api/payments?limit=1 | head -50\nzsh: no matches found: https://finance-hub.lakylak.xyz/api/payments?limit=1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n \"https://finance-hub.lakylak.xyz/api/payments?limit=1\"\n\n<html>\n<head><title>302 Found</title></head>\n<body>\n<center><h1>302 Found</h1></center>\n<hr><center>openresty</center>\n</body>\n</html>\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s https://finance-mcp.lakylak.xyz/.well-known/oauth-authorization-server | python3 -m json.tool\n\n{\n \"issuer\": \"https://auth.lakylak.xyz/application/o/finance-hub-mcp/\",\n \"authorization_endpoint\": \"https://auth.lakylak.xyz/application/o/authorize/\",\n \"token_endpoint\": \"https://auth.lakylak.xyz/application/o/token/\",\n \"jwks_uri\": \"https://auth.lakylak.xyz/application/o/finance-hub-mcp/jwks/\",\n \"response_types_supported\": [\n \"code\"\n ],\n \"grant_types_supported\": [\n \"authorization_code\",\n \"refresh_token\"\n ],\n \"code_challenge_methods_supported\": [\n \"S256\"\n ],\n \"scopes_supported\": [\n \"openid\",\n \"profile\",\n \"email\"\n ],\n \"token_endpoint_auth_methods_supported\": [\n \"none\"\n ]\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $","depth":4,"on_screen":true,"value":"0413\\u0418\\u042f | Debit: 0.09 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u0415\\u041b\\u0415\\u041a\\u0422P\\u041e\\u0425\\u041e\\u041b\\u0414\\u041fP\\u041e\\u0414\\u0410\\u0416\\u0411\\u0418/\\u0414\\u0421\\u041a\\u0414\\u0418\\u0420\\u0415\\u041a\\u0422/\\u0415\\u041b.\\u0415\\u041d\\u0415\\u0420\\u0413\\u0418\\u042f\",\n \"amount\": 0.09,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 0.09,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG15STSA93000004594031\",\n \"autoTags\": [\n \"Bills\"\n ]\n },\n {\n \"rawMessage\": \"Date: 04.05.2026 | Type: \\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418 | Payee: \\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422 | Debit: 29.54 EUR\",\n \"date\": \"2026-05-04T00:00:00.000Z\",\n \"type\": null,\n \"card\": null,\n \"recipient\": \"\\u04210\\u0424\\u0418\\u0419\\u0421\\u041a\\u0410 \\u0412\\u041e\\u0414\\u0410 \\u0414\\u0421\\u041a \\u0414\\u0418\\u0420\\u0415\\u041a\\u0422\",\n \"amount\": 29.54,\n \"currency\": \"EUR\",\n \"balance\": null,\n \"source\": \"UPLOAD\",\n \"debitBgn\": 29.54,\n \"creditBgn\": null,\n \"transactionType\": \"\\u041a\\u041e\\u041c\\u0423\\u041d\\u0410\\u041b\\u041d\\u0418 \\u0423\\u0421\\u041b\\u0423\\u0413\\u0418\",\n \"payerAccount\": \"BG03STSA93000045940400\",\n \"autoTags\": [\n \"Bills\"\n ]\n }\n ],\n \"total\": 10,\n \"skipped\": 0,\n \"errors\": []\n }\n]\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w \"%{http_code}\" https://finance-hub.lakylak.xyz/api/payments\n302% \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s https://finance-hub.lakylak.xyz/api/health\n{\"status\":\"ok\",\"timestamp\":\"2026-05-09T16:43:04.504Z\",\"storage\":{\"type\":\"PostgreSQL\",\"host\":\"db\",\"database\":\"finance_hub\"}}% lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n https://finance-hub.lakylak.xyz/api/payments?limit=1 | head -50\nzsh: no matches found: https://finance-hub.lakylak.xyz/api/payments?limit=1\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -H \"Authorization: Bearer 94bb2917b9a1b9dcbaec49e7009c2a6b222fc310d32f530aa07e411e8d4a058c\" \\\n \"https://finance-hub.lakylak.xyz/api/payments?limit=1\"\n\n<html>\n<head><title>302 Found</title></head>\n<body>\n<center><h1>302 Found</h1></center>\n<hr><center>openresty</center>\n</body>\n</html>\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s https://finance-mcp.lakylak.xyz/.well-known/oauth-authorization-server | python3 -m json.tool\n\n{\n \"issuer\": \"https://auth.lakylak.xyz/application/o/finance-hub-mcp/\",\n \"authorization_endpoint\": \"https://auth.lakylak.xyz/application/o/authorize/\",\n \"token_endpoint\": \"https://auth.lakylak.xyz/application/o/token/\",\n \"jwks_uri\": \"https://auth.lakylak.xyz/application/o/finance-hub-mcp/jwks/\",\n \"response_types_supported\": [\n \"code\"\n ],\n \"grant_types_supported\": [\n \"authorization_code\",\n \"refresh_token\"\n ],\n \"code_challenge_methods_supported\": [\n \"S256\"\n ],\n \"scopes_supported\": [\n \"openid\",\n \"profile\",\n \"email\"\n ],\n \"token_endpoint_auth_methods_supported\": [\n \"none\"\n ]\n}\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.0034722222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.13993056,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14409722,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28055555,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.2847222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.42118055,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4253472,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56180555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5659722,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.70208335,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70625,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.8423611,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.84652776,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95416665,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.4875,"top":0.033333335,"width":0.022916667,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
1620353852688583273
|
912713862244608455
|
visual_change
|
accessibility
|
NULL
|
0413\u0418\u042f | Debit: 0.09 EUR",
0413\u0418\u042f | Debit: 0.09 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u0415\u041b\u0415\u041a\u0422P\u041e\u0425\u041e\u041b\u0414\u041fP\u041e\u0414\u0410\u0416\u0411\u0418/\u0414\u0421\u041a\u0414\u0418\u0420\u0415\u041a\u0422/\u0415\u041b.\u0415\u041d\u0415\u0420\u0413\u0418\u042f",
"amount": 0.09,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 0.09,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
},
{
"rawMessage": "Date: 04.05.2026 | Type: \u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418 | Payee: \u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422 | Debit: 29.54 EUR",
"date": "2026-05-04T00:00:00.000Z",
"type": null,
"card": null,
"recipient": "\u04210\u0424\u0418\u0419\u0421\u041a\u0410 \u0412\u041e\u0414\u0410 \u0414\u0421\u041a \u0414\u0418\u0420\u0415\u041a\u0422",
"amount": 29.54,
"currency": "EUR",
"balance": null,
"source": "UPLOAD",
"debitBgn": 29.54,
"creditBgn": null,
"transactionType": "\u041a\u041e\u041c\u0423\u041d\u0410\u041b\u041d\u0418 \u0423\u0421\u041b\u0423\u0413\u0418",
"payerAccount": "[IBAN]",
"autoTags": [
"Bills"
]
}
],
"total": 10,
"skipped": 0,
"errors": []
}
]
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ clear
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/Downloads $ curl -s -o /dev/null -w "%{http_code}" [URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
[URL_WITH_CREDENTIALS] ~/Downloads $ curl -s -H "Authorization: [AUTH_TOKEN]" \
"[URL_WITH_CREDENTIALS] ~/Downloads $
DOCKER
Close Tab
DEV (-zsh)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
ssh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
14483
|
643
|
41
|
2026-05-09T18:00:52.237357+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-09/1778 /Users/lukas/.screenpipe/data/data/2026-05-09/1778349652237_m1.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
CodeFileEditSelectionViewGoRunTerminalWindow Help→ CodeFileEditSelectionViewGoRunTerminalWindow Help→nas.lakylak.xyz/desktop/?os=ugospro#/Nginx Proxy Manager@Screenpipe - ArchiveSQLite Web: archive.dbSQLite Web: db.sqlitescreenpipe/.claude/skills at main - screenpipe/screenpDXP4800PLUS-B5F8AFFiNE - All In One KnowledgeOSAll docs • AFFiNEPayments LoggerM Your old PC can run Windows 11 in a VM, but not on baLocation LoggerFinance HubFinance HubSelect: transactions - db - AdminerClaude Code | Claude Platform* April 2026 spending by category - Claudelakylak/finance-hub - finance-hub - Gitea: Git with a c• Applications - Admin - authentik+ New TabFilesControl PanelPRIIStorageApp Center/logsLogsSupportQ Search|Connection & AccessUser ManagementFile ServiceW DeviceConnectionDomain/LDAP• TerminalGeneral|• Hardware & PowerTime & Language- NetworkSecurityE Indexing ServiceService• About‹ $0lihl100% C8Sat 9 May 21:00:53CRU RAM1 5.1KвM=E: Control Panel?TelnetSSHEnablePort 23|Advanced settings• EnablePort22Shut down automatically3h later2026-05-09 21:18 will automatically shut downAdvanced settingsFunction descriptionyaswvord fir tie logi accoum ange nabie aute ok eo enhanice sysfeum secuitis recomended to sel a strongApply...
|
NULL
|
8995303474148573410
|
NULL
|
visual_change
|
ocr
|
NULL
|
CodeFileEditSelectionViewGoRunTerminalWindow Help→ CodeFileEditSelectionViewGoRunTerminalWindow Help→nas.lakylak.xyz/desktop/?os=ugospro#/Nginx Proxy Manager@Screenpipe - ArchiveSQLite Web: archive.dbSQLite Web: db.sqlitescreenpipe/.claude/skills at main - screenpipe/screenpDXP4800PLUS-B5F8AFFiNE - All In One KnowledgeOSAll docs • AFFiNEPayments LoggerM Your old PC can run Windows 11 in a VM, but not on baLocation LoggerFinance HubFinance HubSelect: transactions - db - AdminerClaude Code | Claude Platform* April 2026 spending by category - Claudelakylak/finance-hub - finance-hub - Gitea: Git with a c• Applications - Admin - authentik+ New TabFilesControl PanelPRIIStorageApp Center/logsLogsSupportQ Search|Connection & AccessUser ManagementFile ServiceW DeviceConnectionDomain/LDAP• TerminalGeneral|• Hardware & PowerTime & Language- NetworkSecurityE Indexing ServiceService• About‹ $0lihl100% C8Sat 9 May 21:00:53CRU RAM1 5.1KвM=E: Control Panel?TelnetSSHEnablePort 23|Advanced settings• EnablePort22Shut down automatically3h later2026-05-09 21:18 will automatically shut downAdvanced settingsFunction descriptionyaswvord fir tie logi accoum ange nabie aute ok eo enhanice sysfeum secuitis recomended to sel a strongApply...
|
14482
|
NULL
|
NULL
|
NULL
|
|
15040
|
673
|
41
|
2026-05-11T06:10:43.467376+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778479843467_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormVIewINavicareCodeFV faVsco.js?9 JY-20725-h PhpStormVIewINavicareCodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limitProiectC) HubsootPaginationService.ong( OutofRoundsEycention n.yhuospotsyncstrategybase.ongQuotaExceededExceptiorKateLimitexception.onp© RegistrationinvitationMisr© ermactivilyservice.phg© RequestQueuedForDeferrResponseException.php<?phpRinqCentralException.phrRingcentralExtensionNotldeclarelstrict tyoessio:RuntimeException.php( SequenceNumberExceptinamespace Jiminny Excentions:@ ServicelntegrationExcept( ServiceUnavailable Excepuse Throwable:© SidekickSettingsexceptio(4 Socia Account NotFounde(4) SocialAccountTokeninvaliclass RateLimitException extends LogicException(SvncActivitvExcention.oh( TenantisolationEyception11 0public function __construct(string Smessage = "'( TextRelavsxcention.ohv@ TooManvFailedActivitiesprivate readonly int SretryAfter = 1,4 TranscrintionNotindeyedf>Throwable Sorevious = null,@ UneynectedCallSycention4...© UnexpectedEloquentMod© UnexpectedValueExcepti1 usagepublic function getRetryAfter0: int{...}© ZipAttackException.phpD FFMpegD Formats> D Guards> M Helpers.v D Http• _ AccessI okenProviderv C Controllersv DAPI> D AiCallScorindAlReports• DeallnsiantsOoportunit• → PageScorecards• SettinasTeaminsiahts• M Themecv MUserAutomatedRer(C) UserAutomatediv DV2C) ActivitvV2Contr8) AckAnvthinaGor(C) Ack liminnvRend( NonleV2Controll(e OnNemandv2e,0 DievlictControlle"a) DiaulictCharoCnolner Code will hoin INF to underctand vour Laravel ann code II Generate II Don't Show Anvmore (2 minutes aaoiCachedcrmservicebecorator.onp© ProspectCache.phpA SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKob.# console [euJ# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"concenc-lyoe. apolicacion/ison.charser=utt-on"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Security":["max-aqe=31536000: includeSubDomains: preload"].accent-encodino""access-control-allow-credentials": ["false"J."server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".r"*"endnoints"."unl".httns:a.nel.cloudflane.com./nenon+|W/v42c=NVA1cVTPQfVm32anS0ixVF/sd2RI"group\":\"cf-nel\","max_age\":604800}"],"NEL":["{\"success_fraction\":0.01,"report to\":|"cf-nel\"."max age":604800}"]"Server": ["cloudflare"]}} {"correlation_ 10":"95256555-ec98-4541-b9za-adta/Sboyeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545"CascadeNew CascadeS0 l ODally - Platrorm • In 3om100% Lz• Mon 11 May 9:10:43AskJiminnyReportActivityServiceTest+0 ..Cascade Code x• .Kick off a new project. Make changesacross your entre codeoase.^ cilo.• Ootel imitException.php app/ExcepMakefileREADME.md• INSIALL.Mlicenses.md"ohoui Plan.oho aReview @HubspotPaqinationService.pho @MatchActivitvCrmData.oho @Service.pho @RateLimitException.ohp @filel+ « CodeC° AdantiveWN Windsurf Teams22-2 UTF.8io 4 spaces...
|
NULL
|
-9065334500898444559
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormVIewINavicareCodeFV faVsco.js?9 JY-20725-h PhpStormVIewINavicareCodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limitProiectC) HubsootPaginationService.ong( OutofRoundsEycention n.yhuospotsyncstrategybase.ongQuotaExceededExceptiorKateLimitexception.onp© RegistrationinvitationMisr© ermactivilyservice.phg© RequestQueuedForDeferrResponseException.php<?phpRinqCentralException.phrRingcentralExtensionNotldeclarelstrict tyoessio:RuntimeException.php( SequenceNumberExceptinamespace Jiminny Excentions:@ ServicelntegrationExcept( ServiceUnavailable Excepuse Throwable:© SidekickSettingsexceptio(4 Socia Account NotFounde(4) SocialAccountTokeninvaliclass RateLimitException extends LogicException(SvncActivitvExcention.oh( TenantisolationEyception11 0public function __construct(string Smessage = "'( TextRelavsxcention.ohv@ TooManvFailedActivitiesprivate readonly int SretryAfter = 1,4 TranscrintionNotindeyedf>Throwable Sorevious = null,@ UneynectedCallSycention4...© UnexpectedEloquentMod© UnexpectedValueExcepti1 usagepublic function getRetryAfter0: int{...}© ZipAttackException.phpD FFMpegD Formats> D Guards> M Helpers.v D Http• _ AccessI okenProviderv C Controllersv DAPI> D AiCallScorindAlReports• DeallnsiantsOoportunit• → PageScorecards• SettinasTeaminsiahts• M Themecv MUserAutomatedRer(C) UserAutomatediv DV2C) ActivitvV2Contr8) AckAnvthinaGor(C) Ack liminnvRend( NonleV2Controll(e OnNemandv2e,0 DievlictControlle"a) DiaulictCharoCnolner Code will hoin INF to underctand vour Laravel ann code II Generate II Don't Show Anvmore (2 minutes aaoiCachedcrmservicebecorator.onp© ProspectCache.phpA SF (jiminny@localhost]4 HS_local (jiminny@localhost]# console [PKob.# console [euJ# console [slAGiNg)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"concenc-lyoe. apolicacion/ison.charser=utt-on"Transter-Encod1nq":"chunked")."Connection":"keep-alive""CF-Ray" : ["9f80deb8db60dc3a-SOF"],"Strict-Transport-Security":["max-aqe=31536000: includeSubDomains: preload"].accent-encodino""access-control-allow-credentials": ["false"J."server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".r"*"endnoints"."unl".httns:a.nel.cloudflane.com./nenon+|W/v42c=NVA1cVTPQfVm32anS0ixVF/sd2RI"group\":\"cf-nel\","max_age\":604800}"],"NEL":["{\"success_fraction\":0.01,"report to\":|"cf-nel\"."max age":604800}"]"Server": ["cloudflare"]}} {"correlation_ 10":"95256555-ec98-4541-b9za-adta/Sboyeab"."trace_10":C/AD8565-905t-4604-9405-0e5b551e5545"CascadeNew CascadeS0 l ODally - Platrorm • In 3om100% Lz• Mon 11 May 9:10:43AskJiminnyReportActivityServiceTest+0 ..Cascade Code x• .Kick off a new project. Make changesacross your entre codeoase.^ cilo.• Ootel imitException.php app/ExcepMakefileREADME.md• INSIALL.Mlicenses.md"ohoui Plan.oho aReview @HubspotPaqinationService.pho @MatchActivitvCrmData.oho @Service.pho @RateLimitException.ohp @filel+ « CodeC° AdantiveWN Windsurf Teams22-2 UTF.8io 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
15041
|
672
|
41
|
2026-05-11T06:10:45.489755+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778479845489_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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere...
|
[{"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":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","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}]...
|
-7349965412982217516
|
-8168391185862906426
|
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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
iTerm2ShellEditViewSessionScriptsProfilesWindowHelplabl| Daily - Platform • in 35 mA100% C47 8• Mon 11 May 9:10:45DEV (-zsh)• жз181DOCKERO ₴1DEV (-zsh)182APP (-zsh)* JY-20725-handle-HS-search-rate-limitmasterJY-20818-move-AJ-reports-to-separated-datadog-metricJY-20773-fix-automated-reports-user-pilot-trackingJY-20157-AJ-report-not-send-notificationJY-20508-notify-before-AJ-report-expirationJY-20372-ai-reports-promotion-pagesJY-20352-sync-opportunities-without-a-local-owner-user-id-is-nullJY-20738-debug-AJ-tracking-UPaJY-18909-automated-reports-ask-jiminnyJY-20692-fix-integration-app-[API_KEY]@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20725-handle-HS-search-rate-limit) $ l-zsh-zsh885screenpipe"O 86DEV...
|
15039
|
NULL
|
NULL
|
NULL
|
|
15384
|
687
|
41
|
2026-05-11T06:47:20.654996+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778482040654_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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'...
|
[{"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.8081782,"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":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"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 'AskJiminnyReportActivityServiceTest'","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}]...
|
8424537503588443763
|
-7195624815814308410
|
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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
PhostormVIeWINavicarecodeFV faVsco.js°9 JY-20725-handle-HS-search-rate-limitroledeyC) [EMAIL]© TeamService.php(C) TranscodeParameterRescl© HubspotSyncStrategyBase.phpCachedcrmservicebecorator.onp© ProspectCache.php© JiminnyDeb,© UserService.phpC) Uuid.pnp› D Traits> D UseCases> D User> D Utils› D Validationphp nelpers.ongInitialFrontendState.php© Jiminny.php© Plan.phpC) Serializer.ohoC) TeamScimDetails.ohobootstrap>M build>W config>O contrib> M database• M docstront-end>0 lang> node_modules library root> phpstan> D public>O resourcesv Mroutesphp api.phppnp api_vz.ongpnp console.ongpnp customer_api.pnppnp emoedded.onophp health.phpphp scim.phpphp uprotectedweb.phophp web.phpphp webhook.php→D scriotsv O storage•aoo> M debuabarM frameworkv Mloas.aitianoreel audio wav= cuctom loal© MatchActivityCrmData.php© CrmActivityService.php© MatchCrmData.php86087181Y88188989%899897 (v900E hubspot-journal-poll.log= laravel lodclass Client extends Basecllent implements Hubspotcllentintertaceoubuc tunction 1sunauthorizedzxcention Excention sel: 000lplicooaye- our tutowerteeryecheooayeooeM |A2 A65 X1X1Areturn str contains(Smessagel'401 unauthorized')str_contains(Smessage,str contains(Smessagel"htto 401')Corea matchd pattern:'status code 401') 11'/\b401\b/', Smessage) && str_contains(Smessage, 'unauthorized')):* Validates and refreshes the access token if needed before API requests.* This ensures long-running processes don't fail due to token expiration.* achiows soczaLaccounclokenenvaczoexcepcion9 usagespublic function ensureValidToken(): voidif (Sthis->oauthAccount === null) {returnSnewToken = Sthis->tokenManager->ensureValidToken(Sthis->oauthAccount):it Snewloken == nulupublic function aetconfiaoreturns onlv active (archived=false)public function get0wners: arraynotunn Cthic-sao+NowTnctanco@.scnm0_sounoncOl_saot/110r* ananam bool Sarchived* areturn array<Owner> |[]olner Code will hoin INF to underctand vour Laravel ann code II Generate II n.A SF (jiminny@localhost]4 HS_local [jiminny@localhost]# console [PKOb.# console leu)# console [slAGiNG)[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Uace":L"Inu,or May 2020 14.21.15 6Ml"Jn"Transter-Encod1nq":"chunked")."Connection":"keep-alive"]"CF-Ray":L"9t80debödb60dcsa-S0F"J,"Strict-Transport-Secur1ty":"max-aqe=31536008* 1ncLudeSubDomains: preload")naccent-encodino""access-control-allow-credentials": ["false"]."server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\","x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"So+-Cookie"." c+hm-Stlirtd0aXVr.kSandas6hzVVKhzTn0BidvMaheCtm0V-1778163675-1.0.107-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Report-To":["{"endpoints\":[{"unl".httns:la.nel.cloudflane.com./renon+W/v42c=NVA1cVTPQfVm32anS0#xVF/sd2RN\"group)":\"cf-nel\","max_age\":604800}"],"NEL":["{icuecoce Enactionl 1.001|"report_to\":|"cf-nel\"."max age":604800}"]"Server": ["cloudflare"]}} {"correlation_1d":"95256555-ec78-4541-b9za-adta/Sb6Yeab"."trace_10":"C/AD8565-905t-4604-9405-0e50551e5545IIII 1=31IIII40100% S2• • Mon 11 May 9:47:20AskJiminnyReportActivityServiceTest vCascadeHubspot Rate Limit Rej caten (eanecaea tas sextentan sexcepten) .)+0 ..wcatch\Sentry:: captureException($exception);Sresponse = sthis→>response→>errorinternalError selt::MESSAGE GENERALEXCEPTIONSEARCHING=RateLimicexcepcion excepczon excends excepcion = so it talls through to the last catch• Reports to Sentry as a 500 internal error (noisy!)• Returns errorInternalError to the client (extension shows "something went wrong")• The user has no idea this is transientThis is the wrong outcome for a transient 429. There's no retry, no backoff, no useful UX!Contirmed callersCrmController.php:84Sresponse = ScrmService->find(Sname, Sscopes):* Bul lhornSearchCommand (CLI debug only). So yes - fand() is essentially controller-only. It is a synchronous request driven by user typing in the ChromeWhat should hannen on rate limitThis is a cunchronous HTTD reauest — we canlt releace-and-retrv like a ich Ontions ordered hv what I'd recommend.(a) Translate RateLimitException → HTTP 429 with Retrv-After header. This is the standard wav.D php} catch (RateLimitException $e) {return Sthis->response->setStatusCode(429)»ertrortoomanynequessl ern search race-tamared, predse reury shometydeThe frontend then shows a friendly "too many searches, retry in N seconds" instead of a generic error. No Sentry noise.(b) Inside find(), retry once with a short bounded sleep() (similar to searchCallByRecordingURLToken). HubSpot's SECONDLY policy has retry_after = 1 . Asinale 1sln-reauest retry.wouldlahsorh.the.most.common.case//secondlvlhurst Can.retries.at=a.svnchronousHTiTD reauest.shouldnlfhlock 10s/for TEN_SECONDI(c) Don't cache failures. Cache:: remember with TTL 300 will not cache an exception, but it does cache successful empty arrays. The 300s caching of find()results actually helps absorb pressure under typina/repeat searches — that's good, leave it.Recommendation: (a) + (b) combined. Catch RateLimitException inside find(), retry once after min(SretryAfter, 1) s, and if it still fails, let it bubble: controllermaps it to HTTP 429 with Retrv-After7. The Syictind cleen(1) Retrv in searchcall cForPeriodBvPade cearchcal BvRecordinauRLTokenCurrent code• Service.php:1584-15993 catch (Fycention Ceycention)Sthis->logger→>info('(HubSpot) Search calls for period failed'. [...J):OK lets make it extremely simple. Only consider eclient- phpffL220-229 for CHubspotPaginationservice.php#fL162-198 lwill remove it from finio 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
15448
|
688
|
41
|
2026-05-11T06:51:09.858472+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778482269858_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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"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":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","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}]...
|
5988960105550556897
|
-8204420481362449466
|
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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/mie-gawc-dsi?authuser=[EMAIL] Yankov (Presenting)Daily - Platform - now100% 2.%•Mon 11 May 9:51:099FleEditDSelection>circleci>cursonDUUС LEEUTRoatousev examoles/oetconversabocl(1 error_response.jsonrequest sor() response.jsonloois-idt.fsom# crm-task-verification.ndHUbSYOTWEBHOOKEOOLOWю)# INTERNAL_WEBHOOK_CONFIGURATION.mdnudpe-performance-analysis.nd0*090000:0(7 tools-list.json docs/Q8• Mon 11 May 9:51• apl.phpconsoepncustomer_api.phpt cmocoocd.one(1 activity-example.json11 activities-listjsondocs › mep > (1 tools-list /s0n › () result › [ ]tools > () 0 › E nameQucx Eotdescription "Search and browse recoroto voice catts and vioco seetihos (protie calts, 2000, Google Heet, Hicrosort Teans), Use "query" to searc by woat was discussed = e."type": "string""Search by vhat vas discussed. Natural lanquage or keywords. Exanples: 'pricing ebjections", "conpetitor Salesforce mentioned", "BANT budget discussion'.aatetron"type"! "string",*Return conversations that started on or before this date. 150 8601 fornat (YMY-MN-00)-*auration sin"?conversation duration in minutes."SonarQubeЭmд +-25-reindex-strean-nodel-hydrationorioinve?eeto-coeroe undntees-retoeity./ese.oo-Queysrat.ion/Coо1e/C/tAS/ FoCAK/Cte.teActivityTracksCcomsnd.,sheNikolay IvanovNikolay Yankov4 othersSteliyan Georgiev9:51 AM | Daily - PlatformLukas Kovalik• 2:43...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
15587
|
692
|
41
|
2026-05-11T07:02:28.941628+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778482948941_m1.jpg...
|
Firefox
|
Meet - Daily - Platform — Work
|
True
|
meet.google.com/mie-gawc-dsi?authuser=lukas.kovali meet.google.com/mie-gawc-dsi?authuser=lukas.kovalik@jiminny.com...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Meet - Daily - Platform
Close tab
New Tab
Open Goo Meet - Daily - Platform
Close tab
New Tab
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Customize sidebar
You left the meeting
You left the meeting
Rejoin
Rejoin
Return to home screen
Return to home screen
How was the audio and video?
How was the audio and video?
Rate the meeting 1 star out of 5.
Rate the meeting 2 stars out of 5.
Rate the meeting 3 stars out of 5.
Rate the meeting 4 stars out of 5.
Rate the meeting 5 stars out of 5.
Very bad
Very good
Feedback
Feedback
57
Returning to home screen
Galya Dimitrova has left the meeting
Background is no longer replaced...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Meet - Daily - Platform","depth":4,"bounds":{"left":0.0,"top":0.072222225,"width":0.033680554,"height":0.045555554},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.0013888889,"top":0.072222225,"width":0.010416667,"height":0.016666668},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.005902778,"top":0.12,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.0,"top":0.7977778,"width":0.033680554,"height":0.043333333},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.0,"top":0.8411111,"width":0.033680554,"height":0.038333334},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.0,"top":0.8794444,"width":0.033680554,"height":0.03888889},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.0,"top":0.91833335,"width":0.033680554,"height":0.038333334},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.95666665,"width":0.033680554,"height":0.043333333},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You left the meeting","depth":10,"bounds":{"left":0.4045139,"top":0.18333334,"width":0.22465278,"height":0.04888889},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You left the meeting","depth":11,"bounds":{"left":0.4045139,"top":0.18277778,"width":0.22465278,"height":0.050555557},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Rejoin","depth":11,"bounds":{"left":0.41493055,"top":0.27222222,"width":0.062152777,"height":0.044444446},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXStaticText","text":"Rejoin","depth":13,"bounds":{"left":0.43229166,"top":0.28444445,"width":0.027430555,"height":0.020555556},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Return to home screen","depth":11,"bounds":{"left":0.4826389,"top":0.27222222,"width":0.13611111,"height":0.044444446},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Return to home screen","depth":13,"bounds":{"left":0.49930555,"top":0.28444445,"width":0.10277778,"height":0.020555556},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"How was the audio and video?","depth":10,"bounds":{"left":0.41284722,"top":0.39222223,"width":0.20833333,"height":0.046666667},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"How was the audio and video?","depth":11,"bounds":{"left":0.41284722,"top":0.39444444,"width":0.15729167,"height":0.022777777},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Rate the meeting 1 star out of 5.","depth":10,"bounds":{"left":0.41631943,"top":0.43888888,"width":0.033333335,"height":0.053333335},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Rate the meeting 2 stars out of 5.","depth":10,"bounds":{"left":0.45833334,"top":0.43888888,"width":0.033333335,"height":0.053333335},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Rate the meeting 3 stars out of 5.","depth":10,"bounds":{"left":0.5003472,"top":0.43888888,"width":0.033333335,"height":0.053333335},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Rate the meeting 4 stars out of 5.","depth":10,"bounds":{"left":0.54236114,"top":0.43888888,"width":0.033333335,"height":0.053333335},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Rate the meeting 5 stars out of 5.","depth":10,"bounds":{"left":0.584375,"top":0.43888888,"width":0.033333335,"height":0.053333335},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Very bad","depth":11,"bounds":{"left":0.41979167,"top":0.49333334,"width":0.034027778,"height":0.016111111},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Very good","depth":11,"bounds":{"left":0.575,"top":0.49333334,"width":0.03923611,"height":0.016111111},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Feedback","depth":11,"bounds":{"left":0.03784722,"top":0.95111114,"width":0.081597224,"height":0.044444446},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feedback","depth":13,"bounds":{"left":0.06423611,"top":0.9633333,"width":0.044097222,"height":0.020555556},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"57","depth":12,"bounds":{"left":0.061458334,"top":0.11666667,"width":0.011111111,"height":0.018333333},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Returning to home screen","depth":12,"bounds":{"left":0.09201389,"top":0.11666667,"width":0.11423611,"height":0.018333333},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Galya Dimitrova has left the meeting","depth":8,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Background is no longer replaced","depth":8,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
7928453876982972284
|
5321594999467585414
|
visual_change
|
accessibility
|
NULL
|
Meet - Daily - Platform
Close tab
New Tab
Open Goo Meet - Daily - Platform
Close tab
New Tab
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Customize sidebar
You left the meeting
You left the meeting
Rejoin
Rejoin
Return to home screen
Return to home screen
How was the audio and video?
How was the audio and video?
Rate the meeting 1 star out of 5.
Rate the meeting 2 stars out of 5.
Rate the meeting 3 stars out of 5.
Rate the meeting 4 stars out of 5.
Rate the meeting 5 stars out of 5.
Very bad
Very good
Feedback
Feedback
57
Returning to home screen
Galya Dimitrova has left the meeting
Background is no longer replaced...
|
15584
|
NULL
|
NULL
|
NULL
|
|
15671
|
695
|
41
|
2026-05-11T07:07:49.987498+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778483269987_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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
65
1
1
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 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)
{
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
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
{
// First try to get Retry-After from response headers
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;
}
}
if (method_exists($e, 'getResponseBody')) {
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
$policyName = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
if ($policyName === 'TEN_SECONDLY_ROLLING' || $policyName === 'ten_secondly_rolling') {
return 10;
}
if ($policyName === 'SECONDLY' || $policyName === 'secondly') {
return 1;
}
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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') {
$response = $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
$response = $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
//
// $max = $response->getHeaderLine('X-HubSpot-RateLimit-Max'); // "110"
// $remaining = $response->getHeaderLine('X-HubSpot-RateLimit-Remaining'); // "109"
// $interval = $response->getHeaderLine('X-HubSpot-RateLimit-Interval-Milliseconds'); // "10000"
// $body = json_decode((string) $response->getBody(), true);
//
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$max ' . PHP_EOL . print_r($max, true));
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$remaining ' . PHP_EOL . print_r($remaining, true));
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$interval ' . PHP_EOL . print_r($interval, true));
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$body ' . PHP_EOL . print_r($body, true));
return $response;
}
/**
* @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);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"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.8081782,"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":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"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 'AskJiminnyReportActivityServiceTest'","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 'AskJiminnyReportActivityServiceTest'","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.35605052,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"65","depth":4,"bounds":{"left":0.36602393,"top":0.17478053,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.37832448,"top":0.17478053,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.38763297,"top":0.17478053,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39660904,"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.4039229,"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 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 try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\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 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\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 // First try to get Retry-After from response headers\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 if (method_exists($e, 'getResponseBody')) {\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n $policyName = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n if ($policyName === 'TEN_SECONDLY_ROLLING' || $policyName === 'ten_secondly_rolling') {\n return 10;\n }\n if ($policyName === 'SECONDLY' || $policyName === 'secondly') {\n return 1;\n }\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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 $response = $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n $response = $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n//\n// $max = $response->getHeaderLine('X-HubSpot-RateLimit-Max'); // \"110\"\n// $remaining = $response->getHeaderLine('X-HubSpot-RateLimit-Remaining'); // \"109\"\n// $interval = $response->getHeaderLine('X-HubSpot-RateLimit-Interval-Milliseconds'); // \"10000\"\n// $body = json_decode((string) $response->getBody(), true);\n//\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$max ' . PHP_EOL . print_r($max, true));\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$remaining ' . PHP_EOL . print_r($remaining, true));\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$interval ' . PHP_EOL . print_r($interval, true));\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$body ' . PHP_EOL . print_r($body, true));\n\n return $response;\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 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 try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\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 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\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 // First try to get Retry-After from response headers\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 if (method_exists($e, 'getResponseBody')) {\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n $policyName = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n if ($policyName === 'TEN_SECONDLY_ROLLING' || $policyName === 'ten_secondly_rolling') {\n return 10;\n }\n if ($policyName === 'SECONDLY' || $policyName === 'secondly') {\n return 1;\n }\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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 $response = $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n $response = $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n//\n// $max = $response->getHeaderLine('X-HubSpot-RateLimit-Max'); // \"110\"\n// $remaining = $response->getHeaderLine('X-HubSpot-RateLimit-Remaining'); // \"109\"\n// $interval = $response->getHeaderLine('X-HubSpot-RateLimit-Interval-Milliseconds'); // \"10000\"\n// $body = json_decode((string) $response->getBody(), true);\n//\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$max ' . PHP_EOL . print_r($max, true));\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$remaining ' . PHP_EOL . print_r($remaining, true));\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$interval ' . PHP_EOL . print_r($interval, true));\n// \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$body ' . PHP_EOL . print_r($body, true));\n\n return $response;\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":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":"19","depth":4,"bounds":{"left":0.6296542,"top":0.10055866,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.6409575,"top":0.09896249,"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.64827126,"top":0.09896249,"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-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.43018618,"top":0.09736632,"width":0.56981385,"height":0.632083},"on_screen":true,"lines":[{"char_start":207,"char_count":30,"bounds":{"left":0.43018618,"top":0.0,"width":0.07513298,"height":0.014365523}},{"char_start":237,"char_count":36,"bounds":{"left":0.43018618,"top":0.0,"width":0.09075798,"height":0.014365523}},{"char_start":273,"char_count":32,"bounds":{"left":0.43018618,"top":0.0,"width":0.080119684,"height":0.014365523}},{"char_start":305,"char_count":79,"bounds":{"left":0.43018618,"top":0.0,"width":0.20212767,"height":0.014365523}},{"char_start":384,"char_count":18,"bounds":{"left":0.43018618,"top":0.0,"width":0.043882977,"height":0.014365523}},{"char_start":402,"char_count":21,"bounds":{"left":0.43018618,"top":0.0,"width":0.051861703,"height":0.014365523}},{"char_start":423,"char_count":48,"bounds":{"left":0.43018618,"top":0.008778931,"width":0.12167553,"height":0.014365523}},{"char_start":471,"char_count":72,"bounds":{"left":0.43018618,"top":0.026336791,"width":0.18384309,"height":0.014365523}},{"char_start":543,"char_count":40,"bounds":{"left":0.43018618,"top":0.043894652,"width":0.10106383,"height":0.014365523}},{"char_start":583,"char_count":41,"bounds":{"left":0.43018618,"top":0.061452515,"width":0.10372341,"height":0.014365523}},{"char_start":624,"char_count":72,"bounds":{"left":0.43018618,"top":0.079010375,"width":0.18384309,"height":0.014365523}},{"char_start":696,"char_count":219,"bounds":{"left":0.43018618,"top":0.096568234,"width":0.56515956,"height":0.014365523}},{"char_start":915,"char_count":83,"bounds":{"left":0.43018618,"top":0.11412609,"width":0.21243352,"height":0.014365523}},{"char_start":998,"char_count":20,"bounds":{"left":0.43018618,"top":0.13168396,"width":0.04920213,"height":0.014365523}},{"char_start":1018,"char_count":17,"bounds":{"left":0.43018618,"top":0.14924182,"width":0.041223403,"height":0.014365523}},{"char_start":1035,"char_count":203,"bounds":{"left":0.43018618,"top":0.16679968,"width":0.52360374,"height":0.014365523}},{"char_start":1238,"char_count":22,"bounds":{"left":0.43018618,"top":0.18435754,"width":0.05418883,"height":0.014365523}},{"char_start":1260,"char_count":23,"bounds":{"left":0.43018618,"top":0.2019154,"width":0.056848403,"height":0.014365523}},{"char_start":1283,"char_count":10,"bounds":{"left":0.43018618,"top":0.21947326,"width":0.023271276,"height":0.014365523}},{"char_start":1293,"char_count":27,"bounds":{"left":0.43018618,"top":0.23703113,"width":0.06715426,"height":0.014365523}},{"char_start":1320,"char_count":26,"bounds":{"left":0.43018618,"top":0.254589,"width":0.06482713,"height":0.014365523}},{"char_start":1346,"char_count":23,"bounds":{"left":0.43018618,"top":0.27214685,"width":0.056848403,"height":0.014365523}},{"char_start":1369,"char_count":28,"bounds":{"left":0.43018618,"top":0.2897047,"width":0.06981383,"height":0.014365523}},{"char_start":1397,"char_count":57,"bounds":{"left":0.43018618,"top":0.30726257,"width":0.14494681,"height":0.014365523}}],"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","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}]...
|
8457418728391327329
|
-2844753425483298716
|
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
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
65
1
1
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 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)
{
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
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
{
// First try to get Retry-After from response headers
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;
}
}
if (method_exists($e, 'getResponseBody')) {
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
$policyName = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
if ($policyName === 'TEN_SECONDLY_ROLLING' || $policyName === 'ten_secondly_rolling') {
return 10;
}
if ($policyName === 'SECONDLY' || $policyName === 'secondly') {
return 1;
}
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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') {
$response = $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
$response = $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
//
// $max = $response->getHeaderLine('X-HubSpot-RateLimit-Max'); // "110"
// $remaining = $response->getHeaderLine('X-HubSpot-RateLimit-Remaining'); // "109"
// $interval = $response->getHeaderLine('X-HubSpot-RateLimit-Interval-Milliseconds'); // "10000"
// $body = json_decode((string) $response->getBody(), true);
//
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$max ' . PHP_EOL . print_r($max, true));
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$remaining ' . PHP_EOL . print_r($remaining, true));
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$interval ' . PHP_EOL . print_r($interval, true));
// \Illuminate\Support\Facades\Log::channel('custom_channel')->info('$body ' . PHP_EOL . print_r($body, true));
return $response;
}
/**
* @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);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
15769
|
697
|
41
|
2026-05-11T07:13:24.037708+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778483604037_m2.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
NotionMISTOMrTavsco.s?9 JY-20725-handle-HS-search- NotionMISTOMrTavsco.s?9 JY-20725-handle-HS-search-rate-limitProiect© HubspotPaginationService.php>M lustCalli© HubspotSyncStrategyBase.phpD PushSummarvToCrm> D RingCentral>• ZoomPhone© ActivityChangeCatego© AssignOwnership.php(C) ConferenceCrmMatch© MatchactivityermData.php© ermactivilyservice.phgc MatchermData.ono© DeleteActivities.php© DeleteTeamChurnData© DeleteTeamsRetentior© HardDeleteActivities.pc) HarcDeleteacuivity.onc) keindexroraccouniJo!© ReindexForContact.JotC) ReindexForGrouoJob.r© ReindexForLeadJob.pl(C) ReindexForOpportunit© ReindeyForlJser.Job.ph(C) RetrvActivitvSvnc.00.1l@ SyncActivity.php(C) TeardownStream.ohoM Ai AutomationM A Renorts> Audiov AutomatedRenorts(c) ReauectGenerateAck.1© RequestGenerateRepo© SendReportExpiringSo(C) SendPenart loh nhnl© SendReportMailJob.ph© SendReportNotGenera> @ Calendarv D Crmv 0 Delete© DeleteAccountJob.© DeleteContact.Job.r€ DeleteCrmEntityTra© DeleteLeadJob.php© DeleteOpportunityJ© VerifvActivitvCrmTa>MHubspot> M Salesforce© AutoloaDelavedToCrm@ CheckAndRetrvRemoti© CreateFollowupActivit.C) CreateNotes.oho(C) MatchActivitvCrmbate(C) SaveActivitv nhnuse ILLuminate Contracts \queue \ShouLdBeUnaque;use "Luminate contracts Queve Shou doveue:use Illuminate Database Connection;use Illuminate \Queue \InteractsWithQueue;use Illuminate \Queue\SerializesModelsuse iluminate Suoport Facades Loa:use Jiminny Component \Queue \Constants;use Jiminny Excentions InvalidArgumentExcentionsuse Jiminny|Jobs\Job;use Jiminny\Jobs\MiddLeware\HandLeHubspotRateLimit;use Jiminny|Models\Activity;use Jiminny Models\Crm\Configuration;use Jiminny Repositories ActivityRepository:use Jiminny (Services \Crm\CrmActivityService;use Psr\Container\ContainerExceptionInterface;use Psr\Container\NotFoundExceptionInterface;use Throwable:class MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUniqueuse InteractsWithQueve:use SerializesModels:public int Stries = 3:10 usagesprivate int Sactivitvid:private ?Confiauration sfronConfiauration:orivate hool SremoteSearch.public function middleware: arrayt...}public function construct?int SactivityId,?Configuration $fromConfiguration = null,bool SremoteSearch = false,public function uniqueldo: stringf...}public function timeouto: intf...}1 usagepublic function uniqueFor0: intf...}rctand vour Laravel ann code II Generate II Don't Show Anvmore (todav Q•08)© SyncRelatedActivityManager.php© ProspectCache.php© CheckAndRetryRemoteMatch.phpMM8AY= custom.log X=laravel.logA SF (A console [PROD)A console [EU)[2026-05-07 14:21:15] local"neaders".?"Date": ["Thu,07 May 2026 14"Loncent-lyoe". "applicac!"Transter-Encoding":"chun"Connection": ["keep-alive'"CF-Ray":"9t80deb8dbo0dcs"CF-Cache-Status":"DYNAM!"Strict-Transport-Secur1ty"Vary"*"orioin.acceot-encodino""server-timino":"hcid:decfr:desc= "9f80deb8e7c6i"Set-Cookip"."" cfhm=.A7-Mav-26 14•51•15 GMT"Renont-To"."","endnoints"."unl". "httns.Wa.ne"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{\"success_fraction\":0.01,"report to\":|"cf-nel\"."max age":604800}"]"Server":["cloudflare"]}} {"correlation_id":"95236535"trace_id":"c7ab8365-903f-4L Lukás Koválik's No..n HomeEA DSK Report 2023L POS PAYMENT 02.01.2023 13..Report 2025•.. MoreFavorites5 YEAR 20262 App replacementRead latenE LOGS2 Report 2024|Videos4 Todo* Testã DailyAgents+ New aaentQuick Note- WorkKnowledaepe Ideas( Finance hubHome views(A Intearation-appWork Knowledge4 testing keyboard4 Todo4 YEAR 2026( New pagePerconal Home1 LOGS2 Budaet2) Apartmár( Routerª) Population decline explainedConiaritrt nuatd7 New chat x0<>Hubspot API callsWork Knowledge/o Hubspot Hubspot APl calls50 lhl"suppon Dally • In 4h 47 m100% C7. • Mon 11 May 10:13:23Edited 2d agoo Share v @* .*•...
|
NULL
|
4717370112697941075
|
NULL
|
visual_change
|
ocr
|
NULL
|
NotionMISTOMrTavsco.s?9 JY-20725-handle-HS-search- NotionMISTOMrTavsco.s?9 JY-20725-handle-HS-search-rate-limitProiect© HubspotPaginationService.php>M lustCalli© HubspotSyncStrategyBase.phpD PushSummarvToCrm> D RingCentral>• ZoomPhone© ActivityChangeCatego© AssignOwnership.php(C) ConferenceCrmMatch© MatchactivityermData.php© ermactivilyservice.phgc MatchermData.ono© DeleteActivities.php© DeleteTeamChurnData© DeleteTeamsRetentior© HardDeleteActivities.pc) HarcDeleteacuivity.onc) keindexroraccouniJo!© ReindexForContact.JotC) ReindexForGrouoJob.r© ReindexForLeadJob.pl(C) ReindexForOpportunit© ReindeyForlJser.Job.ph(C) RetrvActivitvSvnc.00.1l@ SyncActivity.php(C) TeardownStream.ohoM Ai AutomationM A Renorts> Audiov AutomatedRenorts(c) ReauectGenerateAck.1© RequestGenerateRepo© SendReportExpiringSo(C) SendPenart loh nhnl© SendReportMailJob.ph© SendReportNotGenera> @ Calendarv D Crmv 0 Delete© DeleteAccountJob.© DeleteContact.Job.r€ DeleteCrmEntityTra© DeleteLeadJob.php© DeleteOpportunityJ© VerifvActivitvCrmTa>MHubspot> M Salesforce© AutoloaDelavedToCrm@ CheckAndRetrvRemoti© CreateFollowupActivit.C) CreateNotes.oho(C) MatchActivitvCrmbate(C) SaveActivitv nhnuse ILLuminate Contracts \queue \ShouLdBeUnaque;use "Luminate contracts Queve Shou doveue:use Illuminate Database Connection;use Illuminate \Queue \InteractsWithQueue;use Illuminate \Queue\SerializesModelsuse iluminate Suoport Facades Loa:use Jiminny Component \Queue \Constants;use Jiminny Excentions InvalidArgumentExcentionsuse Jiminny|Jobs\Job;use Jiminny\Jobs\MiddLeware\HandLeHubspotRateLimit;use Jiminny|Models\Activity;use Jiminny Models\Crm\Configuration;use Jiminny Repositories ActivityRepository:use Jiminny (Services \Crm\CrmActivityService;use Psr\Container\ContainerExceptionInterface;use Psr\Container\NotFoundExceptionInterface;use Throwable:class MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUniqueuse InteractsWithQueve:use SerializesModels:public int Stries = 3:10 usagesprivate int Sactivitvid:private ?Confiauration sfronConfiauration:orivate hool SremoteSearch.public function middleware: arrayt...}public function construct?int SactivityId,?Configuration $fromConfiguration = null,bool SremoteSearch = false,public function uniqueldo: stringf...}public function timeouto: intf...}1 usagepublic function uniqueFor0: intf...}rctand vour Laravel ann code II Generate II Don't Show Anvmore (todav Q•08)© SyncRelatedActivityManager.php© ProspectCache.php© CheckAndRetryRemoteMatch.phpMM8AY= custom.log X=laravel.logA SF (A console [PROD)A console [EU)[2026-05-07 14:21:15] local"neaders".?"Date": ["Thu,07 May 2026 14"Loncent-lyoe". "applicac!"Transter-Encoding":"chun"Connection": ["keep-alive'"CF-Ray":"9t80deb8dbo0dcs"CF-Cache-Status":"DYNAM!"Strict-Transport-Secur1ty"Vary"*"orioin.acceot-encodino""server-timino":"hcid:decfr:desc= "9f80deb8e7c6i"Set-Cookip"."" cfhm=.A7-Mav-26 14•51•15 GMT"Renont-To"."","endnoints"."unl". "httns.Wa.ne"group\":\"cf-nel\","max_age\":604800}"]|"NEL":["{\"success_fraction\":0.01,"report to\":|"cf-nel\"."max age":604800}"]"Server":["cloudflare"]}} {"correlation_id":"95236535"trace_id":"c7ab8365-903f-4L Lukás Koválik's No..n HomeEA DSK Report 2023L POS PAYMENT 02.01.2023 13..Report 2025•.. MoreFavorites5 YEAR 20262 App replacementRead latenE LOGS2 Report 2024|Videos4 Todo* Testã DailyAgents+ New aaentQuick Note- WorkKnowledaepe Ideas( Finance hubHome views(A Intearation-appWork Knowledge4 testing keyboard4 Todo4 YEAR 2026( New pagePerconal Home1 LOGS2 Budaet2) Apartmár( Routerª) Population decline explainedConiaritrt nuatd7 New chat x0<>Hubspot API callsWork Knowledge/o Hubspot Hubspot APl calls50 lhl"suppon Dally • In 4h 47 m100% C7. • Mon 11 May 10:13:23Edited 2d agoo Share v @* .*•...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
16733
|
746
|
41
|
2026-05-11T09:19:45.299941+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778491185299_m1.jpg...
|
PhpStorm
|
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Include non-project items
Preview
Filter
Open in F Include non-project items
Preview
Filter
Open in Find Tool Window
playback
PlaybackController.php .../app/Http/Controllers/PlaybackController.php, final class
playback_theme_id jiminny.playback_theme_topics [EU]
playback_theme_id jiminny.scorecard_rules [EU]
playback_theme_id jiminny.playback_theme_topics [jiminny@localhost]
playback_theme_id jiminny.scorecard_rules [jiminny@localhost]
playback_theme_id jiminny.playback_theme_topics [PROD]
playback_theme_id jiminny.scorecard_rules [PROD]
playback_theme_id jiminny.playback_theme_topics [QA]
playback_theme_id jiminny.scorecard_rules [QA]
playback_theme_id jiminny.playback_theme_topics [QAi]
playback_theme_id jiminny.scorecard_rules [QAi]
playback_theme_id jiminny.playback_theme_topics [QAI PROD]
playback_theme_id jiminny.scorecard_rules [QAI PROD]
playback_theme_id jiminny.playback_theme_topics [STAGING]
playback_theme_id jiminny.scorecard_rules [STAGING]
playback_theme_id jiminny_jupiter.playback_theme_topics [STAGING]
PlaybackController \Jiminny\Http\Controllers\API\Page .../app/Http/Controllers/API/Page, class
PlaybackController \Jiminny\Http\Controllers\API .../app/Http/Controllers/API, final class
PlaybackController \Jiminny\Http\Controllers .../app/Http/Controllers, final class
PlaybackController.php .../app/Http/Controllers/API/PlaybackController.php, final class
PlaybackController.php .../app/Http/Controllers/API/Page/PlaybackController.php, class
PlaybackController.php.html build/coverage/Http/Controllers
PlaybackController.php.html build/coverage/Http/Controllers/API
PlaybackController.php.html build/coverage/Http/Controllers/API/Page
PlaybackPageTransformer.php .../app/Http/Transformers/PlaybackPageTransformer.php, class
PlaybackPageTransformer.php.html build/coverage/Http/Transformers
PlaybackService.php .../app/Services/PlaybackService.php, class
PlaybackService.php.html build/coverage/Services
PlaybackTheme.php .../app/Models/PlaybackTheme.php, class
PlaybackTheme.php.html build/coverage/Models
PlaybackThemeAnalyzerService.php .../app/Component/ActivityAnalytics/Service/PlaybackThemeAnalyzerService.php, class
PlaybackThemeAnalyzerService.php.html build/coverage/Component/ActivityAnalytics/Service
PlaybackThemeFactory.php .../database/factories/PlaybackThemeFactory.php, class
playback-themes contrib/playback-themes
paths./page/playback/{activity}
contrib/misc-api.yaml
[playback.audio.stream] GET "/stream/{track}"
playback_themes database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_topics database/schema/mysql-schema.sql
PlaybackPageTransformer \Jiminny\Http\Transformers .../app/Http/Transformers, class
PlaybackService \Jiminny\Services .../app/Services, class
PlaybackTheme \Jiminny\Models .../app/Models, class
PlaybackTheme \Jiminny\Models .../_ide_helper_models.php, class
PlaybackThemeAnalyzerService \Jiminny\Component\ActivityAnalytics\Service .../.../Component/ActivityAnalytics/Service, class
PlaybackThemeFactory \Database\Factories .../database/factories, class
PlaybackThemePolicy \Jiminny\Policies .../app/Policies, final class
PlaybackThemePolicyTest \Tests\Unit\Policies .../tests/Unit/Policies, class
PlaybackThemesCopyCommand \Jiminny\Console\Commands\PlaybackThemes .../.../Commands/PlaybackThemes, class
PlaybackThemesMigrateToVersionsCommand \Jiminny\Console\Commands\PlaybackThemes .../PlaybackThemes, class
PlaybackThemeTopicPolicy \Jiminny\Policies .../app/Policies, class
PlaybackThemeTopicPolicyTest \Tests\Unit\Policies .../tests/Unit/Policies, class
PlaybackController.php .../app/Http/Controllers/PlaybackController.php, final class
playback_theme_id jiminny.playback_theme_topics [EU]
playback_theme_id jiminny.scorecard_rules [EU]
playback_theme_id jiminny.playback_theme_topics [jiminny@localhost]
playback_theme_id jiminny.scorecard_rules [jiminny@localhost]
playback_theme_id jiminny.playback_theme_topics [PROD]
playback_theme_id jiminny.scorecard_rules [PROD]
playback_theme_id jiminny.playback_theme_topics [QA]
playback_theme_id jiminny.scorecard_rules [QA]
playback_theme_id jiminny.playback_theme_topics [QAi]
playback_theme_id jiminny.scorecard_rules [QAi]
playback_theme_id jiminny.playback_theme_topics [QAI PROD]
playback_theme_id jiminny.scorecard_rules [QAI PROD]
playback_theme_id jiminny.playback_theme_topics [STAGING]
playback_theme_id jiminny.scorecard_rules [STAGING]
playback_theme_id jiminny_jupiter.playback_theme_topics [STAGING]
PlaybackController \Jiminny\Http\Controllers\API\Page .../app/Http/Controllers/API/Page, class
PlaybackController \Jiminny\Http\Controllers\API .../app/Http/Controllers/API, final class
PlaybackController \Jiminny\Http\Controllers .../app/Http/Controllers, final class
PlaybackController.php .../app/Http/Controllers/API/PlaybackController.php, final class
PlaybackController.php .../app/Http/Controllers/API/Page/PlaybackController.php, class
PlaybackController.php.html build/coverage/Http/Controllers
PlaybackController.php.html build/coverage/Http/Controllers/API
PlaybackController.php.html build/coverage/Http/Controllers/API/Page
PlaybackPageTransformer.php .../app/Http/Transformers/PlaybackPageTransformer.php, class
PlaybackPageTransformer.php.html build/coverage/Http/Transformers
PlaybackService.php .../app/Services/PlaybackService.php, class
PlaybackService.php.html build/coverage/Services
PlaybackTheme.php .../app/Models/PlaybackTheme.php, class
PlaybackTheme.php.html build/coverage/Models
PlaybackThemeAnalyzerService.php .../app/Component/ActivityAnalytics/Service/PlaybackThemeAnalyzerService.php, class
PlaybackThemeAnalyzerService.php.html build/coverage/Component/ActivityAnalytics/Service
PlaybackThemeFactory.php .../database/factories/PlaybackThemeFactory.php, class
playback-themes contrib/playback-themes
paths./page/playback/{activity}
contrib/misc-api.yaml
[playback.audio.stream] GET "/stream/{track}"
playback_themes database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_topics database/schema/mysql-schema.sql
PlaybackPageTransformer \Jiminny\Http\Transformers .../app/Http/Transformers, class
PlaybackService \Jiminny\Services .../app/Services, class
PlaybackTheme \Jiminny\Models .../app/Models, class
PlaybackTheme \Jiminny\Models .../_ide_helper_models.php, class
PlaybackThemeAnalyzerService \Jiminny\Component\ActivityAnalytics\Service .../.../Component/ActivityAnalytics/Service, class
PlaybackThemeFactory \Database\Factories .../database/factories, class
PlaybackThemePolicy \Jiminny\Policies .../app/Policies, final class
PlaybackThemePolicyTest \Tests\Unit\Policies .../tests/Unit/Policies, class...
|
[{"role":"AXCheckBox","text [{"role":"AXCheckBox","text":"Include non-project items","depth":2,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Preview","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Find Tool Window","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"playback","depth":1,"on_screen":true,"value":"playback","role_description":"text field","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PlaybackController.php .../app/Http/Controllers/PlaybackController.php, final class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [EU]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [EU]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [jiminny@localhost]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [jiminny@localhost]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [PROD]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [PROD]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [QA]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [QA]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [QAi]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [QAi]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [QAI PROD]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [QAI PROD]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [STAGING]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [STAGING]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny_jupiter.playback_theme_topics [STAGING]","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController \\Jiminny\\Http\\Controllers\\API\\Page .../app/Http/Controllers/API/Page, class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController \\Jiminny\\Http\\Controllers\\API .../app/Http/Controllers/API, final class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController \\Jiminny\\Http\\Controllers .../app/Http/Controllers, final class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php .../app/Http/Controllers/API/PlaybackController.php, final class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php .../app/Http/Controllers/API/Page/PlaybackController.php, class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php.html build/coverage/Http/Controllers","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php.html build/coverage/Http/Controllers/API","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php.html build/coverage/Http/Controllers/API/Page","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPageTransformer.php .../app/Http/Transformers/PlaybackPageTransformer.php, class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPageTransformer.php.html build/coverage/Http/Transformers","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackService.php .../app/Services/PlaybackService.php, class","depth":2,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackService.php.html build/coverage/Services","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme.php .../app/Models/PlaybackTheme.php, class","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme.php.html build/coverage/Models","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeAnalyzerService.php .../app/Component/ActivityAnalytics/Service/PlaybackThemeAnalyzerService.php, class","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeAnalyzerService.php.html build/coverage/Component/ActivityAnalytics/Service","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeFactory.php .../database/factories/PlaybackThemeFactory.php, class","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback-themes contrib/playback-themes","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"paths./page/playback/{activity}","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"contrib/misc-api.yaml","depth":2,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"[playback.audio.stream] GET \"/stream/{track}\"","depth":2,"bounds":{"left":0.47847223,"top":0.25333333,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_themes database/schema/mysql-schema.sql","depth":2,"bounds":{"left":0.47847223,"top":0.2777778,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id database/schema/mysql-schema.sql","depth":2,"bounds":{"left":0.47847223,"top":0.30222222,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id database/schema/mysql-schema.sql","depth":2,"bounds":{"left":0.47847223,"top":0.32666665,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_topics database/schema/mysql-schema.sql","depth":2,"bounds":{"left":0.47847223,"top":0.3511111,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPageTransformer \\Jiminny\\Http\\Transformers .../app/Http/Transformers, class","depth":2,"bounds":{"left":0.47847223,"top":0.37555555,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackService \\Jiminny\\Services .../app/Services, class","depth":2,"bounds":{"left":0.47847223,"top":0.4,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme \\Jiminny\\Models .../app/Models, class","depth":2,"bounds":{"left":0.47847223,"top":0.42444444,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme \\Jiminny\\Models .../_ide_helper_models.php, class","depth":2,"bounds":{"left":0.47847223,"top":0.4488889,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeAnalyzerService \\Jiminny\\Component\\ActivityAnalytics\\Service .../.../Component/ActivityAnalytics/Service, class","depth":2,"bounds":{"left":0.47847223,"top":0.47333333,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeFactory \\Database\\Factories .../database/factories, class","depth":2,"bounds":{"left":0.47847223,"top":0.4977778,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemePolicy \\Jiminny\\Policies .../app/Policies, final class","depth":2,"bounds":{"left":0.47847223,"top":0.5222222,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemePolicyTest \\Tests\\Unit\\Policies .../tests/Unit/Policies, class","depth":2,"bounds":{"left":0.47847223,"top":0.5466667,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemesCopyCommand \\Jiminny\\Console\\Commands\\PlaybackThemes .../.../Commands/PlaybackThemes, class","depth":2,"bounds":{"left":0.47847223,"top":0.5711111,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemesMigrateToVersionsCommand \\Jiminny\\Console\\Commands\\PlaybackThemes .../PlaybackThemes, class","depth":2,"bounds":{"left":0.47847223,"top":0.59555554,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeTopicPolicy \\Jiminny\\Policies .../app/Policies, class","depth":2,"bounds":{"left":0.47847223,"top":0.62,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeTopicPolicyTest \\Tests\\Unit\\Policies .../tests/Unit/Policies, class","depth":2,"bounds":{"left":0.47847223,"top":0.64444447,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php .../app/Http/Controllers/PlaybackController.php, final class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [EU]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [EU]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [jiminny@localhost]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [jiminny@localhost]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [PROD]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [PROD]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [QA]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [QA]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [QAi]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [QAi]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [QAI PROD]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [QAI PROD]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.playback_theme_topics [STAGING]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny.scorecard_rules [STAGING]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id jiminny_jupiter.playback_theme_topics [STAGING]","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController \\Jiminny\\Http\\Controllers\\API\\Page .../app/Http/Controllers/API/Page, class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController \\Jiminny\\Http\\Controllers\\API .../app/Http/Controllers/API, final class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController \\Jiminny\\Http\\Controllers .../app/Http/Controllers, final class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php .../app/Http/Controllers/API/PlaybackController.php, final class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php .../app/Http/Controllers/API/Page/PlaybackController.php, class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php.html build/coverage/Http/Controllers","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php.html build/coverage/Http/Controllers/API","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackController.php.html build/coverage/Http/Controllers/API/Page","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPageTransformer.php .../app/Http/Transformers/PlaybackPageTransformer.php, class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPageTransformer.php.html build/coverage/Http/Transformers","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackService.php .../app/Services/PlaybackService.php, class","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackService.php.html build/coverage/Services","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme.php .../app/Models/PlaybackTheme.php, class","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme.php.html build/coverage/Models","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeAnalyzerService.php .../app/Component/ActivityAnalytics/Service/PlaybackThemeAnalyzerService.php, class","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeAnalyzerService.php.html build/coverage/Component/ActivityAnalytics/Service","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeFactory.php .../database/factories/PlaybackThemeFactory.php, class","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback-themes contrib/playback-themes","depth":4,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"paths./page/playback/{activity}","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"contrib/misc-api.yaml","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"[playback.audio.stream] GET \"/stream/{track}\"","depth":4,"bounds":{"left":0.47847223,"top":0.25333333,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_themes database/schema/mysql-schema.sql","depth":4,"bounds":{"left":0.47847223,"top":0.2777778,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id database/schema/mysql-schema.sql","depth":4,"bounds":{"left":0.47847223,"top":0.30222222,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_id database/schema/mysql-schema.sql","depth":4,"bounds":{"left":0.47847223,"top":0.32666665,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"playback_theme_topics database/schema/mysql-schema.sql","depth":4,"bounds":{"left":0.47847223,"top":0.3511111,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPageTransformer \\Jiminny\\Http\\Transformers .../app/Http/Transformers, class","depth":4,"bounds":{"left":0.47847223,"top":0.37555555,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackService \\Jiminny\\Services .../app/Services, class","depth":4,"bounds":{"left":0.47847223,"top":0.4,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme \\Jiminny\\Models .../app/Models, class","depth":4,"bounds":{"left":0.47847223,"top":0.42444444,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTheme \\Jiminny\\Models .../_ide_helper_models.php, class","depth":4,"bounds":{"left":0.47847223,"top":0.4488889,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeAnalyzerService \\Jiminny\\Component\\ActivityAnalytics\\Service .../.../Component/ActivityAnalytics/Service, class","depth":4,"bounds":{"left":0.47847223,"top":0.47333333,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemeFactory \\Database\\Factories .../database/factories, class","depth":4,"bounds":{"left":0.47847223,"top":0.4977778,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemePolicy \\Jiminny\\Policies .../app/Policies, final class","depth":4,"bounds":{"left":0.47847223,"top":0.5222222,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackThemePolicyTest \\Tests\\Unit\\Policies .../tests/Unit/Policies, class","depth":4,"bounds":{"left":0.47847223,"top":0.5466667,"width":0.52152777,"height":0.024444444},"on_screen":false,"role_description":"text"}]...
|
5119147406981649765
|
-6040580356875089553
|
visual_change
|
accessibility
|
NULL
|
Include non-project items
Preview
Filter
Open in F Include non-project items
Preview
Filter
Open in Find Tool Window
playback
PlaybackController.php .../app/Http/Controllers/PlaybackController.php, final class
playback_theme_id jiminny.playback_theme_topics [EU]
playback_theme_id jiminny.scorecard_rules [EU]
playback_theme_id jiminny.playback_theme_topics [jiminny@localhost]
playback_theme_id jiminny.scorecard_rules [jiminny@localhost]
playback_theme_id jiminny.playback_theme_topics [PROD]
playback_theme_id jiminny.scorecard_rules [PROD]
playback_theme_id jiminny.playback_theme_topics [QA]
playback_theme_id jiminny.scorecard_rules [QA]
playback_theme_id jiminny.playback_theme_topics [QAi]
playback_theme_id jiminny.scorecard_rules [QAi]
playback_theme_id jiminny.playback_theme_topics [QAI PROD]
playback_theme_id jiminny.scorecard_rules [QAI PROD]
playback_theme_id jiminny.playback_theme_topics [STAGING]
playback_theme_id jiminny.scorecard_rules [STAGING]
playback_theme_id jiminny_jupiter.playback_theme_topics [STAGING]
PlaybackController \Jiminny\Http\Controllers\API\Page .../app/Http/Controllers/API/Page, class
PlaybackController \Jiminny\Http\Controllers\API .../app/Http/Controllers/API, final class
PlaybackController \Jiminny\Http\Controllers .../app/Http/Controllers, final class
PlaybackController.php .../app/Http/Controllers/API/PlaybackController.php, final class
PlaybackController.php .../app/Http/Controllers/API/Page/PlaybackController.php, class
PlaybackController.php.html build/coverage/Http/Controllers
PlaybackController.php.html build/coverage/Http/Controllers/API
PlaybackController.php.html build/coverage/Http/Controllers/API/Page
PlaybackPageTransformer.php .../app/Http/Transformers/PlaybackPageTransformer.php, class
PlaybackPageTransformer.php.html build/coverage/Http/Transformers
PlaybackService.php .../app/Services/PlaybackService.php, class
PlaybackService.php.html build/coverage/Services
PlaybackTheme.php .../app/Models/PlaybackTheme.php, class
PlaybackTheme.php.html build/coverage/Models
PlaybackThemeAnalyzerService.php .../app/Component/ActivityAnalytics/Service/PlaybackThemeAnalyzerService.php, class
PlaybackThemeAnalyzerService.php.html build/coverage/Component/ActivityAnalytics/Service
PlaybackThemeFactory.php .../database/factories/PlaybackThemeFactory.php, class
playback-themes contrib/playback-themes
paths./page/playback/{activity}
contrib/misc-api.yaml
[playback.audio.stream] GET "/stream/{track}"
playback_themes database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_topics database/schema/mysql-schema.sql
PlaybackPageTransformer \Jiminny\Http\Transformers .../app/Http/Transformers, class
PlaybackService \Jiminny\Services .../app/Services, class
PlaybackTheme \Jiminny\Models .../app/Models, class
PlaybackTheme \Jiminny\Models .../_ide_helper_models.php, class
PlaybackThemeAnalyzerService \Jiminny\Component\ActivityAnalytics\Service .../.../Component/ActivityAnalytics/Service, class
PlaybackThemeFactory \Database\Factories .../database/factories, class
PlaybackThemePolicy \Jiminny\Policies .../app/Policies, final class
PlaybackThemePolicyTest \Tests\Unit\Policies .../tests/Unit/Policies, class
PlaybackThemesCopyCommand \Jiminny\Console\Commands\PlaybackThemes .../.../Commands/PlaybackThemes, class
PlaybackThemesMigrateToVersionsCommand \Jiminny\Console\Commands\PlaybackThemes .../PlaybackThemes, class
PlaybackThemeTopicPolicy \Jiminny\Policies .../app/Policies, class
PlaybackThemeTopicPolicyTest \Tests\Unit\Policies .../tests/Unit/Policies, class
PlaybackController.php .../app/Http/Controllers/PlaybackController.php, final class
playback_theme_id jiminny.playback_theme_topics [EU]
playback_theme_id jiminny.scorecard_rules [EU]
playback_theme_id jiminny.playback_theme_topics [jiminny@localhost]
playback_theme_id jiminny.scorecard_rules [jiminny@localhost]
playback_theme_id jiminny.playback_theme_topics [PROD]
playback_theme_id jiminny.scorecard_rules [PROD]
playback_theme_id jiminny.playback_theme_topics [QA]
playback_theme_id jiminny.scorecard_rules [QA]
playback_theme_id jiminny.playback_theme_topics [QAi]
playback_theme_id jiminny.scorecard_rules [QAi]
playback_theme_id jiminny.playback_theme_topics [QAI PROD]
playback_theme_id jiminny.scorecard_rules [QAI PROD]
playback_theme_id jiminny.playback_theme_topics [STAGING]
playback_theme_id jiminny.scorecard_rules [STAGING]
playback_theme_id jiminny_jupiter.playback_theme_topics [STAGING]
PlaybackController \Jiminny\Http\Controllers\API\Page .../app/Http/Controllers/API/Page, class
PlaybackController \Jiminny\Http\Controllers\API .../app/Http/Controllers/API, final class
PlaybackController \Jiminny\Http\Controllers .../app/Http/Controllers, final class
PlaybackController.php .../app/Http/Controllers/API/PlaybackController.php, final class
PlaybackController.php .../app/Http/Controllers/API/Page/PlaybackController.php, class
PlaybackController.php.html build/coverage/Http/Controllers
PlaybackController.php.html build/coverage/Http/Controllers/API
PlaybackController.php.html build/coverage/Http/Controllers/API/Page
PlaybackPageTransformer.php .../app/Http/Transformers/PlaybackPageTransformer.php, class
PlaybackPageTransformer.php.html build/coverage/Http/Transformers
PlaybackService.php .../app/Services/PlaybackService.php, class
PlaybackService.php.html build/coverage/Services
PlaybackTheme.php .../app/Models/PlaybackTheme.php, class
PlaybackTheme.php.html build/coverage/Models
PlaybackThemeAnalyzerService.php .../app/Component/ActivityAnalytics/Service/PlaybackThemeAnalyzerService.php, class
PlaybackThemeAnalyzerService.php.html build/coverage/Component/ActivityAnalytics/Service
PlaybackThemeFactory.php .../database/factories/PlaybackThemeFactory.php, class
playback-themes contrib/playback-themes
paths./page/playback/{activity}
contrib/misc-api.yaml
[playback.audio.stream] GET "/stream/{track}"
playback_themes database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_id database/schema/mysql-schema.sql
playback_theme_topics database/schema/mysql-schema.sql
PlaybackPageTransformer \Jiminny\Http\Transformers .../app/Http/Transformers, class
PlaybackService \Jiminny\Services .../app/Services, class
PlaybackTheme \Jiminny\Models .../app/Models, class
PlaybackTheme \Jiminny\Models .../_ide_helper_models.php, class
PlaybackThemeAnalyzerService \Jiminny\Component\ActivityAnalytics\Service .../.../Component/ActivityAnalytics/Service, class
PlaybackThemeFactory \Database\Factories .../database/factories, class
PlaybackThemePolicy \Jiminny\Policies .../app/Policies, final class
PlaybackThemePolicyTest \Tests\Unit\Policies .../tests/Unit/Policies, class...
|
16731
|
NULL
|
NULL
|
NULL
|
|
17275
|
769
|
41
|
2026-05-11T10:15:29.649803+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778494529649_m2.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
rostmanFavouritesjiminny(* AirDrop• RecentsA Appli rostmanFavouritesjiminny(* AirDrop• RecentsA Applications9 Documents• Downloadsii lukasIcloud• iCloud Drive992 Svnc toldeLocations0 DXP4800PLUS-B5F A49 Network• CRM• Orange|• Red• Yellow• Greer• Blue• Purple• All lags..caltVIewWindowmelpscreenpipearchive.db• #recycledb.sqlite-shmdb.sqlitevi loassync.log• screenpipe.2026-05-07.0.1ogv data•2026-05-072026-05-062026-04.292026-04-27> 2026-04-25•2026-04-24> 2026-04-22• 2026-04-23• 2026-04-20• 2026.04.212026-04-172026-04-16• 2026-04-15• 2026-04-14screenpipe_sync_updated.sharchive.db-oak>?app• db.sqlite-walscreenpipe_sync.shann cettinas ison• screenpipe.db›_pipesXx Hubspot vYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissions to see who can edit, or upgrade to restore collaborationCOLLECTIONSPost meetings scheduledGET get meetingPost aet link to task> POST Create Contact with AssociationHubspotv Iteration run HSGET Read Copyea. An error occurred.eg. successful operationv Iteration run Search HS> Iournal & webhoooks v4|› OAuth> Pronertioc> RESEARCHSFAPCHPOST search contact by phonePOST search contact by emailPOST Search notesPOST Search calls v3PoSt Search related meetinas v2Post search deals› Tickets> post filter ner comnanv I onlv onen deal stadesGet engagements old associated by dealGET engagements old associated by companyGet get history of property - deal stageGET aet ucereGET SF oauth> GET Meeting outcomes per meeting> GET Read all properties new> Get Read all oronerties oldiGET old call dispositionsGEt list with associationsGET list engagements olcSustem Resource WarningSustem resources are constrained. Thesystem may not be able to generate the loadeded for this test and the cest is likely to§ Connect Git E Console E TerminaНIP Useful › Get Engagement (v1)[URL_WITH_CREDENTIALS] fraction":0.01,"report_to":"cf-nel""max age":604800}cloudflareGlobals Vault Tools?000...
|
NULL
|
8430734856125344446
|
NULL
|
click
|
ocr
|
NULL
|
rostmanFavouritesjiminny(* AirDrop• RecentsA Appli rostmanFavouritesjiminny(* AirDrop• RecentsA Applications9 Documents• Downloadsii lukasIcloud• iCloud Drive992 Svnc toldeLocations0 DXP4800PLUS-B5F A49 Network• CRM• Orange|• Red• Yellow• Greer• Blue• Purple• All lags..caltVIewWindowmelpscreenpipearchive.db• #recycledb.sqlite-shmdb.sqlitevi loassync.log• screenpipe.2026-05-07.0.1ogv data•2026-05-072026-05-062026-04.292026-04-27> 2026-04-25•2026-04-24> 2026-04-22• 2026-04-23• 2026-04-20• 2026.04.212026-04-172026-04-16• 2026-04-15• 2026-04-14screenpipe_sync_updated.sharchive.db-oak>?app• db.sqlite-walscreenpipe_sync.shann cettinas ison• screenpipe.db›_pipesXx Hubspot vYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissions to see who can edit, or upgrade to restore collaborationCOLLECTIONSPost meetings scheduledGET get meetingPost aet link to task> POST Create Contact with AssociationHubspotv Iteration run HSGET Read Copyea. An error occurred.eg. successful operationv Iteration run Search HS> Iournal & webhoooks v4|› OAuth> Pronertioc> RESEARCHSFAPCHPOST search contact by phonePOST search contact by emailPOST Search notesPOST Search calls v3PoSt Search related meetinas v2Post search deals› Tickets> post filter ner comnanv I onlv onen deal stadesGet engagements old associated by dealGET engagements old associated by companyGet get history of property - deal stageGET aet ucereGET SF oauth> GET Meeting outcomes per meeting> GET Read all properties new> Get Read all oronerties oldiGET old call dispositionsGEt list with associationsGET list engagements olcSustem Resource WarningSustem resources are constrained. Thesystem may not be able to generate the loadeded for this test and the cest is likely to§ Connect Git E Console E TerminaНIP Useful › Get Engagement (v1)[URL_WITH_CREDENTIALS] fraction":0.01,"report_to":"cf-nel""max age":604800}cloudflareGlobals Vault Tools?000...
|
17273
|
NULL
|
NULL
|
NULL
|
|
17286
|
768
|
41
|
2026-05-11T10:15:44.861158+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778494544861_m1.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2•ShellEditViewSessionScriptsProfilesWindowHe iTerm2•ShellEditViewSessionScriptsProfilesWindowHelplih§ Support Daily • in 1h 45 mDOCKERDEV (docker)H82APP (-zsh)DEV (docker)X3-zshl84-zsh100% C8• Mon 11 May 13:15:44181ffmpeg0 ₴6configcachecompiledeventsroutesviewsjiminny-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-5:jiminny-worker-processing-5_00:stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00: stoppedworker-emails:worker-emails_00: stoppedworker-nudges:worker-nudges_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00: stoppedworker-crm-sync:worker-crm-sync_00: stoppedartisan-schedule:artisan-schedule_00: stoppedworker-es-update:worker-es-update_00: stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: 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: debugll88510.53ms DONE128.25ms DONE1.73ms DONE1.07ms DONE1.45ms DONE5.46ms DONEDEV...
|
NULL
|
-8059924250003948551
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2•ShellEditViewSessionScriptsProfilesWindowHe iTerm2•ShellEditViewSessionScriptsProfilesWindowHelplih§ Support Daily • in 1h 45 mDOCKERDEV (docker)H82APP (-zsh)DEV (docker)X3-zshl84-zsh100% C8• Mon 11 May 13:15:44181ffmpeg0 ₴6configcachecompiledeventsroutesviewsjiminny-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-5:jiminny-worker-processing-5_00:stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00: stoppedworker-emails:worker-emails_00: stoppedworker-nudges:worker-nudges_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00: stoppedworker-crm-sync:worker-crm-sync_00: stoppedartisan-schedule:artisan-schedule_00: stoppedworker-es-update:worker-es-update_00: stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: 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: debugll88510.53ms DONE128.25ms DONE1.73ms DONE1.07ms DONE1.45ms DONE5.46ms DONEDEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
17394
|
771
|
41
|
2026-05-11T10:21:29.855657+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778494889855_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,
'policy' => $this->parsePolicy($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;
}
}
$policy = $this->parsePolicy($e);
if ($policy === 'TEN_SECONDLY_ROLLING') {
return 10;
}
if ($policy === 'SECONDLY') {
return 1;
}
if ($policy === 'DAILY_LIMIT') {
return 600;
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
public function parsePolicy(Throwable $e): ?string
{
if (! method_exists($e, 'getResponseBody')) {
return null;
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return null;
}
$policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
return is_string($policy) ? strtoupper($policy) : null;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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
Received 429 from API
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/5
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
399
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 10:17:03] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"policy":null,"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\":\"019e168a-5 (truncated...)
"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":11} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":11} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614378,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] ...
|
[{"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.5518617,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.5618351,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.5738032,"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.5834442,"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.59075797,"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 'policy' => $this->parsePolicy($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 \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 $policy = $this->parsePolicy($e);\n if ($policy === 'TEN_SECONDLY_ROLLING') {\n return 10;\n }\n if ($policy === 'SECONDLY') {\n return 1;\n }\n if ($policy === 'DAILY_LIMIT') {\n return 600;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\n }\n\n public function parsePolicy(Throwable $e): ?string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return null;\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 null;\n }\n\n $policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n return is_string($policy) ? strtoupper($policy) : null;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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 'policy' => $this->parsePolicy($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 \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 $policy = $this->parsePolicy($e);\n if ($policy === 'TEN_SECONDLY_ROLLING') {\n return 10;\n }\n if ($policy === 'SECONDLY') {\n return 1;\n }\n if ($policy === 'DAILY_LIMIT') {\n return 600;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\n }\n\n public function parsePolicy(Throwable $e): ?string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return null;\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 null;\n }\n\n $policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n return is_string($policy) ? strtoupper($policy) : null;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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.60206115,"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.6146942,"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":"Received 429 from API","depth":4,"bounds":{"left":0.6256649,"top":0.07980846,"width":0.0631649,"height":0.015961692},"on_screen":true,"value":"Received 429 from API","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.6978058,"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.7077792,"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.71642286,"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.7250665,"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/5","depth":4,"bounds":{"left":0.7386968,"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.7642952,"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.77293885,"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.7815825,"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.79022604,"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":"399","depth":4,"bounds":{"left":0.95977396,"top":0.10933759,"width":0.012632979,"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 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-5 (truncated...)\n\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4a8732a4-99b7-41d1-b7b2-eca5b5e48e29\",\"trace_id\":\"61c44eed-65c5-4e52-a175-3bee690af53c\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"4a8732a4-99b7-41d1-b7b2-eca5b5e48e29\",\"trace_id\":\"61c44eed-65c5-4e52-a175-3bee690af53c\"}\n[2026-05-11 10:17:07] 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\":\"4a8732a4-99b7-41d1-b7b2-eca5b5e48e29\",\"trace_id\":\"61c44eed-65c5-4e52-a175-3bee690af53c\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:11] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:11] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:11] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] 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\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] 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\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] 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\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":11.49,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-9 (truncated...)\n\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] 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\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612183,\"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\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612183} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612183,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612183,\"participants\":[{\"id\":999227,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999228,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612183,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612183,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612183} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612183,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612183,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612182,\"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\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612182} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612182,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612182,\"participants\":[{\"id\":999225,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999226,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612182,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612182,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612182} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612182,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612182,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"86d5bdfe-cc94-41f2-94ba-422242e4e1f5\",\"trace_id\":\"659a90d1-e357-4e8c-a391-979e687c5ae4\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.26,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612181,\"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\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612181} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612181,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612181,\"participants\":[{\"id\":999223,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999224,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] 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\":\"86d5bdfe-cc94-41f2-94ba-422242e4e1f5\",\"trace_id\":\"659a90d1-e357-4e8c-a391-979e687c5ae4\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612181,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612181,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612181} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612181,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612181,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612180,\"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\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612180} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612180,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612180,\"participants\":[{\"id\":999221,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999222,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612180,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612180,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612180} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612180,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612180,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"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\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"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\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"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\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"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\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"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\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"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\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"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\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] 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\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"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\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] 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\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"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\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"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\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"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\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"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\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"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\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.9,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"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\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"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\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"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\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"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\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-c (truncated...)\n\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] 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\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"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\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] 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\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"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\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"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\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] 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\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"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\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"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\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"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\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"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\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610400,\"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\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610400} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610400,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610400,\"participants\":[{\"id\":996275,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null},{\"id\":996276,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":996277,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610400,\"team_id\":2,\"email\":\"aneliya.angelova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610400,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":1460} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610400,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610400} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610400,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610400,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] 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\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.NOTICE: Monitoring start {\"correlation_id\":\"2a3353ba-9883-42be-b596-9e38bd5fc160\",\"trace_id\":\"fc84fbbd-f6ab-40f6-8fdc-f023fbe3b46e\"}\n[2026-05-11 10:17:34] local.NOTICE: Monitoring end {\"correlation_id\":\"2a3353ba-9883-42be-b596-9e38bd5fc160\",\"trace_id\":\"fc84fbbd-f6ab-40f6-8fdc-f023fbe3b46e\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":13} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17: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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17: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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17: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\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:36] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"b6a9ae37-beff-496a-820a-bcf0512308f2\",\"trace_id\":\"be38fb3e-0cfa-4c02-a66a-cc0cf8d3d54a\"}\n[2026-05-11 10:17:36] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"b6a9ae37-beff-496a-820a-bcf0512308f2\",\"trace_id\":\"be38fb3e-0cfa-4c02-a66a-cc0cf8d3d54a\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.49,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:39] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: [EmailSchedule] STARTING batch process {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: [EmailSchedule] FINISHED batch process {\"host\":\"docker_lamp_1\",\"processed\":0} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":13} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:41] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:create\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: [EmailSchedule] STARTING batch create {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: [EmailSchedule] FINISHED batch create {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:create\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: [Jiminny\\Jobs\\Mailbox\\CreateBatches] processed 2 inboxes and created 0 batches {\"userId\":null,\"batchSize\":30,\"maxBatches\":1000} {\"correlation_id\":\"f6431de6-0cbf-4083-96fc-d316ebac17ec\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.23,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-e (truncated...)\n\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":13} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] 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\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] 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\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:46] 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\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] 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\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] 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\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.21,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] 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\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"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\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"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\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"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\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"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\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"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\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"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\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"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\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.19,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:53] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168b-1 (truncated...)\n\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"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\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"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\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"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\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"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\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"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\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"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\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"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\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"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\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"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\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"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\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"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\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"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\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"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\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:59] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"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\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.31,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"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\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"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\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"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\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:02] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:03] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:04] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.47,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:04] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.3,\"average_seconds_per_request\":0.3} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.24,\"average_seconds_per_request\":0.24} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] 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\":\"1042ef38-481f-4e55-9261-bb89ceb4cd6f\",\"trace_id\":\"3cbbfc20-36d7-4827-9e77-e5ea12d34c82\"}\n[2026-05-11 10:18:06] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"1042ef38-481f-4e55-9261-bb89ceb4cd6f\",\"trace_id\":\"3cbbfc20-36d7-4827-9e77-e5ea12d34c82\"}\n[2026-05-11 10:18:06] 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\":\"1042ef38-481f-4e55-9261-bb89ceb4cd6f\",\"trace_id\":\"3cbbfc20-36d7-4827-9e77-e5ea12d34c82\"}\n[2026-05-11 10:18:06] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610539,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610539,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610539,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610878,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610878,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610878,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.25,\"average_seconds_per_request\":0.25} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.48,\"average_seconds_per_request\":0.48} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612340,\"participants_processed\":4,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612340,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612360,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612360,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612339,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612339,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.66,\"average_seconds_per_request\":0.66} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"e0173b67-adc7-4861-acea-33ec563fa8bc\",\"trace_id\":\"df5cbecf-dde1-4674-82c8-8b7a2f4b74de\"}\n[2026-05-11 10:18:09] 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\":\"e0173b67-adc7-4861-acea-33ec563fa8bc\",\"trace_id\":\"df5cbecf-dde1-4674-82c8-8b7a2f4b74de\"}\n[2026-05-11 10:18:09] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.3,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:09] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.26,\"average_seconds_per_request\":0.26} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611455,\"team_id\":2,\"email\":\"aneliya.angelova@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611455,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611455,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610915,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610915,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610915,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610528,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610528,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610528,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611087,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611087,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611087,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611076,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611076,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611076,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610497,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610497,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610497,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610867,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610867,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610867,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610490,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610490,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610490,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610506,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610506,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610506,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610885,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610885,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610885,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610874,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610874,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610874,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610617,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610617,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610617,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.NOTICE: Monitoring start {\"correlation_id\":\"f1c8fc03-337f-4edb-a859-cd9fb18b900e\",\"trace_id\":\"503eff58-a255-4b63-9001-481d9a9bd530\"}\n[2026-05-11 10:18:11] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.27,\"average_seconds_per_request\":0.27} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.NOTICE: Monitoring end {\"correlation_id\":\"f1c8fc03-337f-4edb-a859-cd9fb18b900e\",\"trace_id\":\"503eff58-a255-4b63-9001-481d9a9bd530\"}\n[2026-05-11 10:18:12] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:12] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:12] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.42,\"average_seconds_per_request\":0.42} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614382,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614382,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614382,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] 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\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] 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\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18: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\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614381,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614381,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614381,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.55,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610426,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610426,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610426,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.27,\"average_seconds_per_request\":0.27} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"447782589921@txt.staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.23,\"average_seconds_per_request\":0.23} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"4f01fa5e-5837-4b03-af04-ccad937f80f4\",\"trace_id\":\"7ea236cf-a366-4cea-8e77-3417ec22eac5\"}\n[2026-05-11 10:18:18] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"4f01fa5e-5837-4b03-af04-ccad937f80f4\",\"trace_id\":\"7ea236cf-a366-4cea-8e77-3417ec22eac5\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612560,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612560,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612560,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610462,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610462,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610462,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.24,\"average_seconds_per_request\":0.24} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"adelina.petrova@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.23,\"average_seconds_per_request\":0.23} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:19] local.INFO: [EmailSchedule] STARTING batch process {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:19] local.INFO: [EmailSchedule] FINISHED batch process {\"host\":\"docker_lamp_1\",\"processed\":0} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:19] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612819,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612819,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"adelina.petrova@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612847,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612847,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612847,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610451,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610451,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610451,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] 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\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"447782589921@txt.staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612562,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612562,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612562,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610764,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610764,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610764,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] 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\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614436,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614436,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614436,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610438,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610438,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610438,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] 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\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":615092,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":615092,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":615092,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.23,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610403,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610403,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610403,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"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\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610935,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610935,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610935,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610470,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610470,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610470,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"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\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610900,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610900,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610900,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nmalchev@gmail.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614378,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614378,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614378,\"remote_search\":true,\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612561,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612561,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612336,\"participants_processed\":4,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612336,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"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\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611451,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611451,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611451,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"conference:monitor:count\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:21] local.INFO: Running conference:monitor:count command for activities in (2026-05-11 10:16:00, 2026-05-11 10:18:00] {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:21] local.INFO: [conference:monitor:count] No activities found in (2026-05-11 10:16:00, 2026-05-11 10:18:00] {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:21] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"conference:monitor:count\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:25] 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\":\"5d165f52-8b9b-49f4-826c-5e6effb36469\",\"trace_id\":\"8d23eb87-94aa-45be-a25c-60adf651f65b\"}\n[2026-05-11 10:18:26] 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\":\"5d165f52-8b9b-49f4-826c-5e6effb36469\",\"trace_id\":\"8d23eb87-94aa-45be-a25c-60adf651f65b\"}\n[2026-05-11 10:18:26] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.38,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:19:05] 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\":\"b818863b-2a43-41d9-8ff6-fee7c3d716bc\",\"trace_id\":\"247ba4af-b613-440c-94fe-1c5b9acb9a49\"}\n[2026-05-11 10:19:05] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"b818863b-2a43-41d9-8ff6-fee7c3d716bc\",\"trace_id\":\"247ba4af-b613-440c-94fe-1c5b9acb9a49\"}\n[2026-05-11 10:19:05] 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\":\"b818863b-2a43-41d9-8ff6-fee7c3d716bc\",\"trace_id\":\"247ba4af-b613-440c-94fe-1c5b9acb9a49\"}\n[2026-05-11 10:19:07] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"ebc86a92-142f-437d-993d-b5babcf2cc26\",\"trace_id\":\"afbbde14-96ad-42a5-a9b8-acbb3e1d637a\"}\n[2026-05-11 10:19:07] 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\":\"ebc86a92-142f-437d-993d-b5babcf2cc26\",\"trace_id\":\"afbbde14-96ad-42a5-a9b8-acbb3e1d637a\"}\n[2026-05-11 10:19:08] local.NOTICE: Monitoring start {\"correlation_id\":\"e77a8f39-a88c-4046-abe4-817093d395f4\",\"trace_id\":\"17ae50a2-26b7-48ab-a9a4-1188e484d567\"}\n[2026-05-11 10:19:08] local.NOTICE: Monitoring end {\"correlation_id\":\"e77a8f39-a88c-4046-abe4-817093d395f4\",\"trace_id\":\"17ae50a2-26b7-48ab-a9a4-1188e484d567\"}\n[2026-05-11 10:19:09] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"82c9f998-b4ec-42a5-9114-b34b4ef4418e\",\"trace_id\":\"398aab71-a970-4adb-bfd2-e7003c988e9b\"}\n[2026-05-11 10:19:09] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"82c9f998-b4ec-42a5-9114-b34b4ef4418e\",\"trace_id\":\"398aab71-a970-4adb-bfd2-e7003c988e9b\"}\n[2026-05-11 10:19:10] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}\n[2026-05-11 10:19:10] local.INFO: [EmailSchedule] STARTING batch process {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}\n[2026-05-11 10:19:10] local.INFO: [EmailSchedule] FINISHED batch process {\"host\":\"docker_lamp_1\",\"processed\":0} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}\n[2026-05-11 10:19:10] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}","depth":4,"on_screen":true,"value":"[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:03] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-5 (truncated...)\n\"} {\"correlation_id\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f0becb3b-1f4f-4fb3-a311-9056fd2ae449\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"78f847cf-6495-4054-b3d4-e179a133bd42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"14d1f2d6-526c-4a7b-9dbe-f310d28baff2\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"f9846f48-5841-4a71-b500-64b802c67d05\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"d060f13a-e3b7-416c-ac24-ebc305d1fd66\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"b3cb7cc8-9e53-4962-af9d-a06a2bc1211f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"ee78448a-70af-4da3-a3cd-238e2067a49c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"74704a29-86b2-4b3f-ae73-0e6d4ec1891a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0698152e-ea7b-46d1-95e4-45730b1aac4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"503e9564-ad58-44d0-9757-576b830ee22a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"c7deb69c-6c07-4701-a67e-aac8a6e7eae5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"0d5af06d-774a-423e-8566-cb9f43e49711\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"80021afa-cf61-496e-89ce-8c3e54208849\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"26cb04a3-9455-48ca-bbec-d8afcaf66d89\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"1394ff3a-8967-4099-957d-78dd3bd1ad06\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"8e71d37f-8fcc-4294-a951-7e7e1fa36414\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"e3d5ac8c-21da-4854-8976-7e5916c19626\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"5ac0504a-ec31-4cd3-bee9-a22a17043d87\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"dc55bf51-23a4-467e-a0eb-e005ac332df8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3eef285e-0d37-4ed8-b4ab-aa92cf893970\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"3c8a085d-bdf1-40eb-a97e-a240a0d42001\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:05] 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\":\"d931b6c6-ab61-4e56-863b-aed2be3cf628\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"247ebe62-b545-410c-9a1a-a64a2a16f74f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8eec93ee-21ff-4839-8d92-4c5e73e5cb02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"e1add09a-4136-4471-aaab-635ce3913944\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"0dc18256-a5c4-4809-8f4f-ae8acfa1c62a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"fc4dcdd9-0121-448e-8b4e-fc0e39d20a72\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"8b734f7b-ff76-4bcd-b217-f33580cc5d42\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"ba79ca47-b56d-4686-9d40-25f98db53e2d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"eee09476-7cfd-47f1-9265-8d0f1f77edc7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"62c5275c-1274-41ee-bc3f-5bbf783b9e37\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:06] 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\":\"c07694f1-899f-4ac8-be40-e00a204aac88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a42bd4c7-5a99-40a1-8f2d-310dc2de3d2e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"bb1f8c52-2f4c-4c3b-b77f-4f1a1bb3109d\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4d5f5c05-bcfd-478f-aa51-3301a9db49f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"4a8732a4-99b7-41d1-b7b2-eca5b5e48e29\",\"trace_id\":\"61c44eed-65c5-4e52-a175-3bee690af53c\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"a80a8412-d94f-42a6-b884-72c206ac1da4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"4a8732a4-99b7-41d1-b7b2-eca5b5e48e29\",\"trace_id\":\"61c44eed-65c5-4e52-a175-3bee690af53c\"}\n[2026-05-11 10:17:07] 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\":\"4a8732a4-99b7-41d1-b7b2-eca5b5e48e29\",\"trace_id\":\"61c44eed-65c5-4e52-a175-3bee690af53c\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"227671e6-a371-4f4c-b68e-79cfc8a40b80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"b0316038-52d2-4649-bbfd-3398e4ba616c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"8d0009ec-aa6b-43eb-b5e9-9fdebab1bc88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"3759f33f-9281-45e5-82c7-b8232490ee14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:07] 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\":\"e1fd0d0c-ddd7-483c-a454-704b27f83a35\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"65015bee-210a-4abd-ae8e-9b347db68ce5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"03c44248-e58c-4287-8e6d-5c619c6fb75f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"23ed7387-c743-4302-9b44-8d9813be4fe5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"aeabaf4b-f18e-43fd-aefc-396f54ca6ec9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"522ee9f2-8c92-480b-acda-f4759553f0b0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:08] 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\":\"8b4434a0-8bca-4ffb-9883-31415fdcd948\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"ff0483e4-50c5-4943-9ac0-1521c68a84a6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:09] 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\":\"37c561fb-7972-4263-aac8-89d830ebc5c7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"b3bfac4d-fb8a-4113-a07a-e949910a9e3f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:10] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:11] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:11] 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\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:11] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"093de884-5d00-46dd-8202-1f6294142ac4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] 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\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] 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\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] 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\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:12] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"55d42510-0a7f-49da-92bb-3d7d04f519e0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:13] 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\":\"771b143d-9ff2-4447-952a-0f3e56249c53\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:14] 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\":\"87d35b30-46fd-4cbe-815e-3c7fc0873c55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:15] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:16] 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\":\"f4441c9e-1575-406a-9087-739d00f7051a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"0c63e1d6-a318-43c2-8cc4-a2e00c5260e3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:17] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"3268196e-0a93-4fd3-a61b-5dfcc3e560a8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":11.49,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"09a1bea2-5b92-4a89-8617-bc5809db48d1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:19] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"40b197d4-a099-4e5a-9b85-7d5e01a97d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"6548c611-b94a-40c9-8a0e-d3c24ba47072\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"4cce51ee-846b-43b2-a0cd-d83dc5eff920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"b0e6efce-5447-4d7d-be32-a4dfafa64fdc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e8c5b540-3796-4bed-b52c-3f7a6b7586aa\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:21] 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\":\"e5125373-9a81-49ac-ab11-5aebfe6aea74\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-9 (truncated...)\n\"} {\"correlation_id\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:22] 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\":\"611796ed-b766-420d-a544-4fdb1123b4f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"f69192c9-9ba8-48e0-b614-996bf3dcc7d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"6522d428-c400-448c-9130-a06133b21471\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"0588c797-4ae0-4d7b-b3ee-9706e7ef39df\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612183,\"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\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612183} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612183,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612183,\"participants\":[{\"id\":999227,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999228,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612183,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612183,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612183} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612183,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612183,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"946c4e96-6983-445b-a842-b212439024fd\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612182,\"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\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612182} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612182,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612182,\"participants\":[{\"id\":999225,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999226,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612182,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612182,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612182} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612182,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612182,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"f5eaabe1-ed2b-4779-8907-9a7cb181c90e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"86d5bdfe-cc94-41f2-94ba-422242e4e1f5\",\"trace_id\":\"659a90d1-e357-4e8c-a391-979e687c5ae4\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.26,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612181,\"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\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612181} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612181,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612181,\"participants\":[{\"id\":999223,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999224,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] 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\":\"86d5bdfe-cc94-41f2-94ba-422242e4e1f5\",\"trace_id\":\"659a90d1-e357-4e8c-a391-979e687c5ae4\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612181,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612181,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612181} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612181,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612181,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d2216c54-0324-4668-a561-66c972bd24b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612180,\"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\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612180} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612180,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612180,\"participants\":[{\"id\":999221,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999222,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612180,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612180,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612180} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612180,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612180,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"f8c127c2-60ef-47b1-b0e2-5adb2b6d7349\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"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\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"0869934c-f4d0-46a1-8387-f2393c5bce93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"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\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"4e3d1181-634e-4ea2-8ac6-7da2a722c455\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"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\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"bd88fcdb-25fc-4e20-bec3-36897d7c6d4e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"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\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17: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\":\"c1d5bb08-3fac-4938-926a-3e672915d6c3\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"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\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"c1161db6-2192-487f-94d9-fb763ee00ea9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"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\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"bd974d1f-98c3-43ec-a0ee-c373b13e5a55\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"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\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:28] 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\":\"6b6b45e9-7387-4b73-a6c1-1302a6e959cc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"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\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] 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\":\"3d3fbb4c-6268-4e40-bf22-931be4baeb1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"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\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"75bdd542-1e62-4704-861a-810a631074bf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"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\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:29] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"923e5701-fa97-4252-a235-5cfe1a50c951\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"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\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"afecdc02-a4b8-431a-baee-e5f104160539\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"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\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"30a67f60-f844-4758-bc2c-79a6b1ec958a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"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\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"2989f086-0b73-4b12-b24c-8665376dcf18\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.9,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"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\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:31] 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\":\"0c19e519-0adf-4903-a45d-44559f23151f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"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\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"fc1002b7-ac5b-4080-b6fa-497070177a88\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"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\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"738402b4-5306-4346-9286-7b1fb94db69f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"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\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:32] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-c (truncated...)\n\"} {\"correlation_id\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] 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\":\"2356bf77-077c-400e-ac58-cebd0719ff80\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"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\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] 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\":\"2e2173eb-7d9e-43e9-b8e2-2c6bb1d4c684\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"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\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"63a0af1c-277e-446c-9a48-9757a8d34ddc\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"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\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] 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\":\"b324376c-1fd3-497f-b0fb-004f86f50635\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"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\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"b2b3cc5b-60ce-4c18-bb68-76d30013357c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"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\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:33] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"d6026499-3681-474a-85f7-3faee13605b8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"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\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"17b3d9a6-2eb0-49d1-8a00-c67c644885e1\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"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\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"112a2c70-a5f2-4500-9726-7f560d683236\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610400,\"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\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610400} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610400,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610400,\"participants\":[{\"id\":996275,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null},{\"id\":996276,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":996277,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610400,\"team_id\":2,\"email\":\"aneliya.angelova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610400,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":1460} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610400,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610400} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610400,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610400,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"8cbe2d45-c42f-42bb-85b7-0d645c9e64b6\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] 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\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6868b438-d843-4331-9862-f802e4cc4ff2\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f600c314-da4f-48ea-885b-f3b0db553881\"}\n[2026-05-11 10:17:34] local.NOTICE: Monitoring start {\"correlation_id\":\"2a3353ba-9883-42be-b596-9e38bd5fc160\",\"trace_id\":\"fc84fbbd-f6ab-40f6-8fdc-f023fbe3b46e\"}\n[2026-05-11 10:17:34] local.NOTICE: Monitoring end {\"correlation_id\":\"2a3353ba-9883-42be-b596-9e38bd5fc160\",\"trace_id\":\"fc84fbbd-f6ab-40f6-8fdc-f023fbe3b46e\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ac88094e-4a12-4e5c-87dd-c7701d7a8719\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"5b7869a5-e05c-417f-819f-12774e20bb56\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":13} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72bb1bed-9270-436f-977c-a73c970415a3\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ef02c9ff-d0fc-47cb-aeb0-e8ba837de699\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e1608ca2-4101-4e24-8c9f-29ba81ce925f\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"40f1c570-c73a-4bea-99d1-0b405485c1eb\"}\n[2026-05-11 10:17:34] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6f43c701-78e8-4a90-bc73-feecc83e035c\"}\n[2026-05-11 10:17: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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17: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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17: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\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"714584dc-ec4b-479a-aecd-db6c109f4a6d\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f7f53665-81f1-4b01-86eb-56ad96f088db\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7356be9b-68c6-4c39-9fbe-d16bafce4614\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb97cad3-6d10-4315-a771-a5c3a8aeeb31\"}\n[2026-05-11 10:17:36] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"b6a9ae37-beff-496a-820a-bcf0512308f2\",\"trace_id\":\"be38fb3e-0cfa-4c02-a66a-cc0cf8d3d54a\"}\n[2026-05-11 10:17:36] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"b6a9ae37-beff-496a-820a-bcf0512308f2\",\"trace_id\":\"be38fb3e-0cfa-4c02-a66a-cc0cf8d3d54a\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.49,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73d4c333-df67-43c5-a413-4c675a3ebc5e\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0c0e087e-66cf-4404-b647-530f77b3e652\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:37] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8ae56005-eaea-4862-83a4-4c28e0deb862\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"72f691bf-4dd5-46e4-b0aa-e6d9947e244c\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:38] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9c039918-1cd4-4208-bd24-8e42d3efb19e\"}\n[2026-05-11 10:17:39] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: [EmailSchedule] STARTING batch process {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: [EmailSchedule] FINISHED batch process {\"host\":\"docker_lamp_1\",\"processed\":0} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"07a987cd-1db5-4796-b217-d8d2d1b6913e\",\"trace_id\":\"90eeb583-f4ef-4d3f-bf6e-2425312728c5\"}\n[2026-05-11 10:17:39] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:39] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"207e2c1f-73c1-428d-80a6-3c87aa383443\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3b238a85-6f7e-44ab-8dac-2e8f132b32fe\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:40] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":13} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"233b41da-91f2-45fb-8a21-80d2cd24570d\"}\n[2026-05-11 10:17:41] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:create\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: [EmailSchedule] STARTING batch create {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: [EmailSchedule] FINISHED batch create {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:create\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"e17eab55-f6ef-40c4-bcf7-0b2b4af23908\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:41] local.INFO: [Jiminny\\Jobs\\Mailbox\\CreateBatches] processed 2 inboxes and created 0 batches {\"userId\":null,\"batchSize\":30,\"maxBatches\":1000} {\"correlation_id\":\"f6431de6-0cbf-4083-96fc-d316ebac17ec\",\"trace_id\":\"fab32d53-3e12-42b6-b809-50dcad19899b\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"ae1e1745-b1f8-4fa9-9d96-b0ec9934cbbd\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f131d63b-7da9-4a0c-b9d5-4a2d2ae772f1\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":15} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"93d7f7d1-3a5c-47ce-bc42-1af98a032e7b\"}\n[2026-05-11 10:17:42] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.23,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168a-e (truncated...)\n\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"efb63783-8dfd-4c44-805a-c36bcb5e317e\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"34f22bc6-50a7-4f6e-96be-552d05a23255\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:43] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"624ce203-96d1-4009-ae4e-5b6635eff4b0\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":13} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"99d1cf07-a91d-4a90-8059-1fe54fb6097a\"}\n[2026-05-11 10:17:44] 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\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] 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\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"71db6557-d1a4-488a-bcaa-cefeb41f9f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"c4fcf2aa-0846-4e80-b18b-251b2d368949\"}\n[2026-05-11 10:17:44] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:44] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"286a6558-1e66-4ffb-b32f-9f823a296d14\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"c0afdc10-8cad-4dab-9147-5495fc19b7c4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1b88706b-8ac4-431d-8696-8f8766ecae33\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"d8ceac67-8853-4fbf-b4de-796abc2eadc8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] 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\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"b4c629ce-833d-484c-8155-4df866fe54cf\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"168d2aac-7bb8-4249-b62a-e088ef05a5c3\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"067b89fc-5453-49ae-a3fa-5dfdb487c294\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":10} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e2d3538d-9a14-45c4-b068-84b3732061df\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:45] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"e7285c6c-728d-4284-b885-7e9e9df72706\"}\n[2026-05-11 10:17:46] 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\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] 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\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:46] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"5463b5ad-2286-4568-8f68-76b82d8a4c54\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"ca6930a0-aebc-4338-856e-6a439a838639\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7721c535-7311-417a-b30a-1286a84e037b\"}\n[2026-05-11 10:17:47] 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\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] 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\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"e20af459-b149-4a19-8ef6-4444b4cee8f9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":14} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90f3fc25-e34d-4c3a-b35c-84317a633c78\"}\n[2026-05-11 10:17:47] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.21,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":12} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6264c9dd-ba42-4c8f-a21f-3dffeb0c31c6\"}\n[2026-05-11 10:17:48] 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\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"64b7efd5-f92f-42b8-95ba-9a9e76fbb676\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] 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\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"aa8720ba-c5e3-4d7e-a7c3-697da34a195e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"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\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"1abedcde-ca97-4113-b4a6-60a45a16f9d8\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"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\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:48] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"d4390ffe-1359-41f6-9feb-f0bfbfdafc61\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"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\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"42a128d7-d841-4c03-a6c0-7b9fa918ec1e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"68eaf196-29ca-48a3-8e46-5bf37620dd08\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":2,\"retry_after\":10,\"delay\":11} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f997c306-a176-4f3a-8699-d9cd083d6993\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:49] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"18efa24c-257e-4842-af7d-5ec20872ab02\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"af4fe4e8-53c1-4339-8100-49dadac0f280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"68a001e2-a116-4b5d-b8e7-902d08ada842\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"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\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:51] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"19bb8a09-8a89-4524-bfc1-e972923a1f2b\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"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\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"dd53be6e-a456-46da-ab7c-c2988301922f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"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\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:52] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"4d0438c5-9dc4-4b93-b643-6417ac75f31a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"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\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.19,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:53] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"policy\":null,\"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\\\":\\\"019e168b-1 (truncated...)\n\"} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"5b1bde17-34b2-4c96-a240-52c83ddc5c93\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"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\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"88d5107a-d1a9-4def-8f1f-6ff8bea40516\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"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\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:53] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"9eb70001-f31f-427d-9ecb-d42969509f8e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"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\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"b291b19d-e631-4390-a8ce-49431d5f566f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"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\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"4b8fb89e-a1a0-4894-81d9-5d1e86570512\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"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\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f27f33ba-8caa-49a5-9cad-cd8293e9a7db\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"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\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"af6121c1-ef51-49a6-acda-bb121812831a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"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\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:55] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"7c89eb2a-2a39-463f-abad-6b13e5fed935\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"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\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:56] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"9c37e4f5-1e21-4f96-86d0-2d8f2ce76d49\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"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\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":11} {\"correlation_id\":\"5a0ad4cc-8cdd-4f1e-8bae-a70a2f7b7280\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"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\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:57] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"9884d6bc-6966-4c2b-b123-bd6bff97b920\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"a7f9bc7e-977e-4032-820f-1e0b80c6214f\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"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\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"4674593f-9f44-4f03-8474-ff0a7926a543\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"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\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"9c459c55-c8be-453e-9540-0477f5134f6f\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"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\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"52ae8415-fd35-4109-8db4-45893cf37c4c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:58] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"3693e67e-875d-4232-a495-1621a90bf41a\"}\n[2026-05-11 10:17:58] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:58] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"56a279f5-3276-4781-9691-6ac712992a03\"}\n[2026-05-11 10:17:59] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"2149fff4-fc50-4b5e-8346-f4fe92446383\"}\n[2026-05-11 10:17:59] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"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\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.31,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:17:59] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":13} {\"correlation_id\":\"6c488719-2433-44c2-be14-6234030389cb\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"af37fbba-e927-4df9-840b-3ede48a1d911\"}\n[2026-05-11 10:18:00] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"534825cf-e6d0-42f8-8ff6-18fee9ebbcf9\"}\n[2026-05-11 10:18:00] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"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\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:00] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":15} {\"correlation_id\":\"13c3f8a7-53c0-490e-915d-f30216c6fae9\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"785d023d-231c-4c69-9e14-64b9f386cd8a\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"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\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"aea37783-669f-433b-aac7-ead252f60285\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"73386989-234b-4074-93cd-b907d73fb039\"}\n[2026-05-11 10:18:01] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"67837137-7da9-4fc3-807c-fa87dbcc5090\"}\n[2026-05-11 10:18:01] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1d0c22f1-5e71-452c-94ab-4a7ba39ee8be\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"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\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:01] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":3,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"5e4163ac-fdc7-49df-89de-383bf3f5bcd4\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:02] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:02] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9476099f-6f93-4402-b763-b075c4f8ed44\"}\n[2026-05-11 10:18:03] 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}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] 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}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7e0e12d1-b270-490b-848b-763e373c90e0\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"adaf1f1e-8477-469f-86c9-9c59d2623f11\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:03] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"1235043b-578e-49e0-9ebe-230be6d9a8f8\"}\n[2026-05-11 10:18:04] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610539,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610539,\"participants\":[{\"id\":996485,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996486,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:04] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.47,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:04] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.3,\"average_seconds_per_request\":0.3} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:05] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.24,\"average_seconds_per_request\":0.24} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] 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\":\"1042ef38-481f-4e55-9261-bb89ceb4cd6f\",\"trace_id\":\"3cbbfc20-36d7-4827-9e77-e5ea12d34c82\"}\n[2026-05-11 10:18:06] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"1042ef38-481f-4e55-9261-bb89ceb4cd6f\",\"trace_id\":\"3cbbfc20-36d7-4827-9e77-e5ea12d34c82\"}\n[2026-05-11 10:18:06] 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\":\"1042ef38-481f-4e55-9261-bb89ceb4cd6f\",\"trace_id\":\"3cbbfc20-36d7-4827-9e77-e5ea12d34c82\"}\n[2026-05-11 10:18:06] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610539,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610539,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610539} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610539,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610539,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"556047b1-b970-491f-90a1-03a361d35100\"}\n[2026-05-11 10:18:06] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610878,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610878,\"participants\":[{\"id\":997035,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997036,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:06] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610878,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610878,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610878} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610878,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610878,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"657e3baa-5806-4803-8f06-5375e09f4728\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612340,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612340,\"participants\":[{\"id\":999516,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999517,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999518,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999519,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612340,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.25,\"average_seconds_per_request\":0.25} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.48,\"average_seconds_per_request\":0.48} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612340,\"participants_processed\":4,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612340} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612340,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:07] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612340,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6b8427b4-3b81-40ed-b97f-336493ac466a\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612360,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612360,\"participants\":[{\"id\":999552,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999553,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999565,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612360,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612360,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612360} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612360,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612360,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bea3a6fc-5389-4a59-a601-2f8fe9a2d01c\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612339,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612339,\"participants\":[{\"id\":999514,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999515,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999540,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612339,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612339,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612339} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612339,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612339,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"f92f5ee2-fe1d-48c0-812c-1ef5822e650b\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611455,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611455,\"participants\":[{\"id\":997961,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997962,\"user_id\":1460,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"support@staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/support%40staging.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\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:08] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.66,\"average_seconds_per_request\":0.66} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"e0173b67-adc7-4861-acea-33ec563fa8bc\",\"trace_id\":\"df5cbecf-dde1-4674-82c8-8b7a2f4b74de\"}\n[2026-05-11 10:18:09] 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\":\"e0173b67-adc7-4861-acea-33ec563fa8bc\",\"trace_id\":\"df5cbecf-dde1-4674-82c8-8b7a2f4b74de\"}\n[2026-05-11 10:18:09] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:09] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.3,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:09] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.26,\"average_seconds_per_request\":0.26} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611455,\"team_id\":2,\"email\":\"aneliya.angelova@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611455,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611455} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611455,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611455,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"dd54f05a-e554-44ab-9379-da61bcac65a5\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610915,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610915,\"participants\":[{\"id\":997104,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997105,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610915,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610915,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610915} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610915,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610915,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"b8548036-8907-428c-a1a8-534820e4d593\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610528,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610528,\"participants\":[{\"id\":996463,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996464,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610528,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610528,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610528} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610528,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610528,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"538a5f7a-a2da-4a62-8b62-211aeb5dc208\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611087,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611087,\"participants\":[{\"id\":997368,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997369,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611087,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611087,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611087} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611087,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611087,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"356103b6-5095-43de-8a30-6e30a04734da\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611076,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611076,\"participants\":[{\"id\":997346,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997347,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611076,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611076,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611076} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611076,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611076,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"9e9f9d73-ae12-4bdb-86a9-b2dfc5eadb1e\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610497,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610497,\"participants\":[{\"id\":996401,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996402,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610497,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610497,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610497} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610497,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610497,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57a562f3-a27e-4b76-9ef2-191fc918812c\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610867,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610867,\"participants\":[{\"id\":997011,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997012,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610867,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610867,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610867} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610867,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610867,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"6d84e7da-d52b-4ded-b8d7-965a68fa0f14\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610490,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610490,\"participants\":[{\"id\":996385,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996386,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610490,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610490,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610490} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610490,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610490,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cf6a7852-6696-4be0-b6ae-0d2ba5896580\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610506,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610506,\"participants\":[{\"id\":996419,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996420,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610506,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610506,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610506} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610506,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610506,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8496279e-9085-40b8-9c1f-8b7b0844ca74\"}\n[2026-05-11 10:18:10] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610885,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:10] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:10] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610885,\"participants\":[{\"id\":997051,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997052,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610885,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610885,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610885} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610885,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610885,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"bb9bd43b-dc0f-49a3-9926-6e7b545e4484\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610874,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610874,\"participants\":[{\"id\":997025,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997026,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610874,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610874,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610874} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610874,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610874,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"57100b89-c0f3-48a5-aafb-af04e1e7b2a8\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610617,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610617,\"participants\":[{\"id\":996641,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996642,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610617,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610617,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610617} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610617,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610617,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"660593a5-69f3-4b40-a2c6-ca235b404df4\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] 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\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.NOTICE: Monitoring start {\"correlation_id\":\"f1c8fc03-337f-4edb-a859-cd9fb18b900e\",\"trace_id\":\"503eff58-a255-4b63-9001-481d9a9bd530\"}\n[2026-05-11 10:18:11] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.27,\"average_seconds_per_request\":0.27} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:11] local.NOTICE: Monitoring end {\"correlation_id\":\"f1c8fc03-337f-4edb-a859-cd9fb18b900e\",\"trace_id\":\"503eff58-a255-4b63-9001-481d9a9bd530\"}\n[2026-05-11 10:18:12] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:12] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:12] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.42,\"average_seconds_per_request\":0.42} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614382,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614382,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614382,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"cfa58e4a-596f-4cd7-923f-89852d3dd448\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] 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\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] 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\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18: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\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614381,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614381,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614381,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"68a943a9-28db-4452-81a3-9bb8e3bbd404\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.55,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610426,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610426,\"participants\":[{\"id\":996306,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996307,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610426,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610426,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610426} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610426,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610426,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"90da6de9-ad64-4ba1-8913-870cd9008e44\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] 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\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.27,\"average_seconds_per_request\":0.27} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"447782589921@txt.staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:16] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.23,\"average_seconds_per_request\":0.23} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:17] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"4f01fa5e-5837-4b03-af04-ccad937f80f4\",\"trace_id\":\"7ea236cf-a366-4cea-8e77-3417ec22eac5\"}\n[2026-05-11 10:18:18] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"4f01fa5e-5837-4b03-af04-ccad937f80f4\",\"trace_id\":\"7ea236cf-a366-4cea-8e77-3417ec22eac5\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612560,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612560,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612560,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"768d721d-1a47-4144-bc8b-43d4aad7cf7a\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610462,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610462,\"participants\":[{\"id\":996353,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996354,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610462,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610462,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610462} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610462,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610462,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"d20720d8-78ec-4300-9c6c-6e6d63dd5979\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] 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\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/contact/search\",\"total_requests\":1,\"total_records_fetched\":0,\"total_elapsed_seconds\":0.24,\"average_seconds_per_request\":0.24} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"adelina.petrova@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache miss {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\",\"crm\":\"hubspot\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:18] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"domain\",\"identifier\":\"jiminny.com\"} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: [HubSpot] importAccount {\"crm_provider_id\":\"749766179\",\"config_id\":2} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: [HubSpot] CRM Search requested {\"request\":{\"filterGroups\":[{\"filters\":[{\"propertyName\":\"associations.company\",\"operator\":\"EQ\",\"value\":\"749766179\"},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedwon\",\"4040964\",\"59247967\"]},{\"propertyName\":\"dealstage\",\"operator\":\"NOT_IN\",\"values\":[\"closedlost\",\"4040965\",\"59247968\"]}]}],\"sorts\":[{\"propertyName\":\"modifieddate\",\"direction\":\"DESCENDING\"}],\"properties\":[\"dealname\",\"amount\",\"hubspot_owner_id\",\"pipeline\",\"dealstage\",\"closedate\",\"deal_currency_code\"],\"limit\":200}} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: [Hubspot] Pagination completed {\"team_id\":2,\"endpoint\":\"https://api.hubapi.com/crm/v3/objects/deals/search\",\"total_requests\":1,\"total_records_fetched\":10,\"total_elapsed_seconds\":0.23,\"average_seconds_per_request\":0.23} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:19] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:19] local.INFO: [EmailSchedule] STARTING batch process {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:19] local.INFO: [EmailSchedule] FINISHED batch process {\"host\":\"docker_lamp_1\",\"processed\":0} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:19] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"add7477b-8e9d-44ef-9c16-cf763d7fd973\",\"trace_id\":\"0a4036d4-4c6b-4724-8efb-d8375a7dfe6a\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612819,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612819,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"4935e6a6-a430-454c-abfd-3ecbfe2a8093\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"adelina.petrova@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612847,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612847,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612847,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"59a52e35-0442-4b9c-ba94-13987f6e5045\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610451,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610451,\"participants\":[{\"id\":996340,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996341,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610451,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610451,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610451} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610451,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"8852008d-42e1-4838-bf44-0fb139bad2c7\"}\n[2026-05-11 10:18:20] 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\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"447782589921@txt.staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612562,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612562,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612562,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"c88f4636-6a5a-42b8-8b5f-57817eb88000\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610764,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610764,\"participants\":[{\"id\":996951,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996952,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610764,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610764,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610764} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610764,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610764,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"de0766e3-67e9-4a70-ade6-579313484aab\"}\n[2026-05-11 10:18:20] 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\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614436,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614436,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614436,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"26844961-f2c1-4818-8fbf-4e75fed45dd0\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610438,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610438,\"participants\":[{\"id\":996320,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996321,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610438,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610438,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610438} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610438,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610438,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"7d7ce093-516d-49a9-aa85-d06a603548de\"}\n[2026-05-11 10:18:20] 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\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":615092,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":615092,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":615092,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"701da656-d862-4f53-a173-98bd0462ba59\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.23,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610403,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610403,\"participants\":[{\"id\":996282,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996283,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610403,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610403,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610403} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610403,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610403,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"cb6cee8f-e823-491f-a523-22966ea386a9\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610935,\"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\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610935,\"participants\":[{\"id\":997141,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997142,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610935,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610935,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610935} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610935,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610935,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"2882970b-de3a-4bff-8cc2-c9d0182ad10c\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610470,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610470,\"participants\":[{\"id\":996369,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":996370,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610470,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610470,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610470} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610470,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610470,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\",\"correlation_id\":\"0d9cdf36-1d5a-4bbb-8f3e-5b28e82a73b2\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":610900,\"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\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":610900,\"participants\":[{\"id\":997081,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997082,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":610900,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":610900,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":610900} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":610900,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":610900,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"64a23169-398d-4b52-b6ff-2027ac5ca8f5\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] 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\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"nikolay.nikolov@jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nmalchev@gmail.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":614378,\"team_id\":2,\"email\":\"nikolay.nikolov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":614378,\"participants_processed\":3,\"exact_matches\":1,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":614378,\"remote_search\":true,\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null} {\"correlation_id\":\"4770fe06-51ae-468a-b56b-ba82eab8d88e\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] 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\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612561,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612561,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"4aabf216-0b76-4e76-968f-76cae4d9d3e7\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612336,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612336,\"participants\":[{\"id\":999508,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999509,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999512,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999513,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612336,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612336,\"participants_processed\":4,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612336} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612336,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612336,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"9fbdbe9b-2bfb-4f6b-b8cd-2459c7919210\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":611451,\"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\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":611451,\"participants\":[{\"id\":997955,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":997956,\"user_id\":18,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"support@staging.jiminny.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [Prospect match] Resolved company domain from email {\"email\":\"support@staging.jiminny.com\",\"domain\":\"jiminny.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":611451,\"team_id\":2,\"email\":\"veselin.kulov@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":611451,\"participants_processed\":2,\"exact_matches\":0,\"domain_matches\":1,\"best_match_found\":true} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":611451} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":611451,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":611451,\"remote_search\":true,\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89} {\"correlation_id\":\"08b7fc4c-2330-4317-a9bd-e4b8a5164358\",\"trace_id\":\"8e45b868-2eb5-42f8-a91e-22951e49d57d\"}\n[2026-05-11 10:18:21] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"conference:monitor:count\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:21] local.INFO: Running conference:monitor:count command for activities in (2026-05-11 10:16:00, 2026-05-11 10:18:00] {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:21] local.INFO: [conference:monitor:count] No activities found in (2026-05-11 10:16:00, 2026-05-11 10:18:00] {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:21] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"conference:monitor:count\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"5cd332f8-5b05-4813-bf28-dc3f5c776c31\",\"trace_id\":\"9d576391-5ec6-47d4-9c55-77e4dc0e5881\"}\n[2026-05-11 10:18:25] 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\":\"5d165f52-8b9b-49f4-826c-5e6effb36469\",\"trace_id\":\"8d23eb87-94aa-45be-a25c-60adf651f65b\"}\n[2026-05-11 10:18:26] 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\":\"5d165f52-8b9b-49f4-826c-5e6effb36469\",\"trace_id\":\"8d23eb87-94aa-45be-a25c-60adf651f65b\"}\n[2026-05-11 10:18:26] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":0.38,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"4ad05333-9afb-492e-9f0f-b2909ac45b32\",\"trace_id\":\"3d8feb24-b173-4158-b0a4-4cf33af85066\"}\n[2026-05-11 10:19:05] 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\":\"b818863b-2a43-41d9-8ff6-fee7c3d716bc\",\"trace_id\":\"247ba4af-b613-440c-94fe-1c5b9acb9a49\"}\n[2026-05-11 10:19:05] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"b818863b-2a43-41d9-8ff6-fee7c3d716bc\",\"trace_id\":\"247ba4af-b613-440c-94fe-1c5b9acb9a49\"}\n[2026-05-11 10:19:05] 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\":\"b818863b-2a43-41d9-8ff6-fee7c3d716bc\",\"trace_id\":\"247ba4af-b613-440c-94fe-1c5b9acb9a49\"}\n[2026-05-11 10:19:07] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"ebc86a92-142f-437d-993d-b5babcf2cc26\",\"trace_id\":\"afbbde14-96ad-42a5-a9b8-acbb3e1d637a\"}\n[2026-05-11 10:19:07] 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\":\"ebc86a92-142f-437d-993d-b5babcf2cc26\",\"trace_id\":\"afbbde14-96ad-42a5-a9b8-acbb3e1d637a\"}\n[2026-05-11 10:19:08] local.NOTICE: Monitoring start {\"correlation_id\":\"e77a8f39-a88c-4046-abe4-817093d395f4\",\"trace_id\":\"17ae50a2-26b7-48ab-a9a4-1188e484d567\"}\n[2026-05-11 10:19:08] local.NOTICE: Monitoring end {\"correlation_id\":\"e77a8f39-a88c-4046-abe4-817093d395f4\",\"trace_id\":\"17ae50a2-26b7-48ab-a9a4-1188e484d567\"}\n[2026-05-11 10:19:09] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"82c9f998-b4ec-42a5-9114-b34b4ef4418e\",\"trace_id\":\"398aab71-a970-4adb-bfd2-e7003c988e9b\"}\n[2026-05-11 10:19:09] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:skip-lists:refresh\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"82c9f998-b4ec-42a5-9114-b34b4ef4418e\",\"trace_id\":\"398aab71-a970-4adb-bfd2-e7003c988e9b\"}\n[2026-05-11 10:19:10] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}\n[2026-05-11 10:19:10] local.INFO: [EmailSchedule] STARTING batch process {\"host\":\"docker_lamp_1\"} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}\n[2026-05-11 10:19:10] local.INFO: [EmailSchedule] FINISHED batch process {\"host\":\"docker_lamp_1\",\"processed\":0} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}\n[2026-05-11 10:19:10] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:process\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"00ff8a16-df56-4dbe-89ee-949f1fec10ae\",\"trace_id\":\"48f7dab8-39b8-47ff-badc-9e61a319de61\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3137932281513863855
|
2919994867551517044
|
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,
'policy' => $this->parsePolicy($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;
}
}
$policy = $this->parsePolicy($e);
if ($policy === 'TEN_SECONDLY_ROLLING') {
return 10;
}
if ($policy === 'SECONDLY') {
return 1;
}
if ($policy === 'DAILY_LIMIT') {
return 600;
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
public function parsePolicy(Throwable $e): ?string
{
if (! method_exists($e, 'getResponseBody')) {
return null;
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return null;
}
$policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
return is_string($policy) ? strtoupper($policy) : null;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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
Received 429 from API
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/5
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
399
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 10:17:03] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:03] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.WARNING: [Hubspot] No retry-after header or policy name found, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"policy":null,"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\":\"019e168a-5 (truncated...)
"} {"correlation_id":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"f0becb3b-1f4f-4fb3-a311-9056fd2ae449","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"858d73b2-b1ef-46ae-ba14-6ba5fb5e53ab","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":11} {"correlation_id":"78f847cf-6495-4054-b3d4-e179a133bd42","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":11} {"correlation_id":"97d1197e-aa94-42ee-80b1-9cc6d9e96a9b","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614378,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] 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":"2522b1c9-7751-4eb5-874a-0cacc3cf2ac5","trace_id":"8e45b868-2eb5-42f8-a91e-22951e49d57d"}
[2026-05-11 10:17:04] ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
17478
|
774
|
41
|
2026-05-11T10:24:13.286907+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778495053286_m2.jpg...
|
Firefox
|
Screenpipe — Archive — Personal
|
True
|
app.screenpipe.lakylak.xyz
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/
2026
Calendar
SECONDLY
Search
AND also
second required term — both must appear in same result (optional)
Source
App
Date
dd
/
mm
/
yyyy
Calendar
(blank = all dates)
From
--
:
--
To
--
:
--
Only apps
any app (blank = all)
▾
Skip apps
none skipped
▾
FTS tip: single words work best · "exact phrase" · term1 OR term2 · use AND also for required second term · times are in your local timezone · click any result to expand
49 results
▶ video
7 May 19:25
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:SpolicyName = $body
'policyName'
?? Sbody
'policy'
?? null:Map pollcy names to retry delaysif (SpolicvName === 'TEN
SECONDLY
_ROLLING' |I SpolicvName === 'ten
secondly
rolling') {
… (click to expand)
▶ video
7 May 19:10
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:Snolievlane = Sbod/LUpoltiev/lane:1 22 Shody
LnolieyL1L.22 п11rao nolicy names to retry delav1f SpoLicvName ==='TEN
SECONDLY
ROLLING' |I SpolicvName === 'ten
secondly
rolling') {Le
… (click to expand)
7 May 17:24
Typed
Firefox
text
⏱ Timeline
.
7 May 17:23
Typed
Firefox
text
⏱ Timeline
7 May 17:22
Typed
Firefox
text
⏱ Timeline
.
7 May 17:22
Typed
Firefox
text
⏱ Timeline
'
7 May 17:21
Typed
Firefox
text
⏱ Timeline
7 May 17:20
Typed
Firefox
text
⏱ Timeline
7 May 17:19
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox
text
⏱ Timeline
$
7 May 17:17
Typed
Firefox
text
⏱ Timeline
;
7 May 17:17
Typed
Firefox
text
⏱ Timeline
=
7 May 17:16
Typed
Firefox
text
⏱ Timeline
:
7 May 17:16
Typed
Firefox
text
⏱ Timeline
7 May 17:15
Typed
Firefox
text
⏱ Timeline
.
7 May 17:15
Typed
Firefox
text
⏱ Timeline
7 May 17:14
Typed
Firefox
text
⏱ Timeline
7 May 17:14
Typed
Firefox
text
⏱ Timeline
.
7 May 17:10
Typed
Firefox
text
⏱ Timeline
7 May 17:09
Typed
Firefox
text
⏱ Timeline...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.28823137,"top":0.0518755,"width":0.113696806,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.30152926,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.28823137,"top":0.08459697,"width":0.113696806,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.30152926,"top":0.09577015,"width":0.037898935,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.38962767,"top":0.09177973,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.29105717,"top":0.118914604,"width":0.108211435,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.29105717,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.3020279,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.3131649,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.32430187,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.33543882,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe [archive.db · 12323.6MB]","depth":7,"bounds":{"left":0.4085771,"top":0.061452515,"width":0.06698803,"height":0.017956903},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"bounds":{"left":0.4085771,"top":0.06304868,"width":0.027759308,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[archive.db · 12323.6MB]","depth":9,"bounds":{"left":0.43766624,"top":0.06703911,"width":0.037898935,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"bounds":{"left":0.48021942,"top":0.059856344,"width":0.024767287,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"bounds":{"left":0.5056516,"top":0.059856344,"width":0.023769947,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"bounds":{"left":0.53008646,"top":0.059856344,"width":0.020944148,"height":0.0207502},"on_screen":true,"help_text":"No audio data in this database","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"bounds":{"left":0.55169547,"top":0.059856344,"width":0.03507314,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Timetable","depth":7,"bounds":{"left":0.5874335,"top":0.059856344,"width":0.029753989,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"bounds":{"left":0.6178524,"top":0.059856344,"width":0.034075797,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"bounds":{"left":0.93849736,"top":0.0650439,"width":0.008144947,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"07","depth":9,"bounds":{"left":0.9552859,"top":0.06464485,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"bounds":{"left":0.96110374,"top":0.06464485,"width":0.0023271276,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"05","depth":9,"bounds":{"left":0.9644282,"top":0.06464485,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"bounds":{"left":0.970246,"top":0.06464485,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"bounds":{"left":0.9737367,"top":0.06464485,"width":0.009474734,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"bounds":{"left":0.98454124,"top":0.0650439,"width":0.0051529254,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"SECONDLY","depth":8,"bounds":{"left":0.4965093,"top":0.11412609,"width":0.38131648,"height":0.025538707},"on_screen":true,"value":"SECONDLY","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":8,"bounds":{"left":0.88048536,"top":0.11412609,"width":0.024933511,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AND also","depth":9,"bounds":{"left":0.4965093,"top":0.15522745,"width":0.01662234,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"second required term — both must appear in same result (optional)","depth":8,"bounds":{"left":0.51579124,"top":0.14764565,"width":0.38962767,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Source","depth":9,"bounds":{"left":0.4965093,"top":0.18754987,"width":0.012300532,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App","depth":9,"bounds":{"left":0.58427525,"top":0.18754987,"width":0.006981383,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Date","depth":9,"bounds":{"left":0.6431183,"top":0.18754987,"width":0.008144947,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dd","depth":10,"bounds":{"left":0.65791225,"top":0.18715084,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":9,"bounds":{"left":0.66373,"top":0.18715084,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mm","depth":10,"bounds":{"left":0.6672208,"top":0.18715084,"width":0.004654255,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":9,"bounds":{"left":0.67287236,"top":0.18715084,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"yyyy","depth":10,"bounds":{"left":0.67636305,"top":0.18715084,"width":0.009640957,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":9,"bounds":{"left":0.6871675,"top":0.18754987,"width":0.005319149,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(blank = all dates)","depth":9,"bounds":{"left":0.69863695,"top":0.18794893,"width":0.028756648,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"From","depth":9,"bounds":{"left":0.7300532,"top":0.18754987,"width":0.008976064,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.7456782,"top":0.18715084,"width":0.004654255,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"bounds":{"left":0.7513298,"top":0.18715084,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.75482047,"top":0.18715084,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To","depth":9,"bounds":{"left":0.7742686,"top":0.18754987,"width":0.004155585,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.78507316,"top":0.18715084,"width":0.004654255,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"bounds":{"left":0.79072475,"top":0.18715084,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.79421544,"top":0.18715084,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Only apps","depth":9,"bounds":{"left":0.4965093,"top":0.21588188,"width":0.017453458,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"any app (blank = all)","depth":11,"bounds":{"left":0.51961434,"top":0.2150838,"width":0.038065158,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▾","depth":11,"bounds":{"left":0.5718085,"top":0.21628092,"width":0.0016622341,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Skip apps","depth":9,"bounds":{"left":0.5817819,"top":0.21588188,"width":0.017121011,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"none skipped","depth":11,"bounds":{"left":0.60455453,"top":0.2150838,"width":0.025265958,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▾","depth":11,"bounds":{"left":0.65674865,"top":0.21628092,"width":0.0016622341,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FTS tip: single words work best · \"exact phrase\" · term1 OR term2 · use AND also for required second term · times are in your local timezone · click any result to expand","depth":9,"bounds":{"left":0.4965093,"top":0.23902634,"width":0.29055852,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"49 results","depth":10,"bounds":{"left":0.4978391,"top":0.29209897,"width":0.017453458,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.50964093,"top":0.3367917,"width":0.012300532,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 19:25","depth":11,"bounds":{"left":0.5340758,"top":0.32043096,"width":0.021110373,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.55851066,"top":0.32202715,"width":0.010139627,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PhpStorm","depth":12,"bounds":{"left":0.57130986,"top":0.32043096,"width":0.01861702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ faVsco.js – Client.php","depth":11,"bounds":{"left":0.5909242,"top":0.32043096,"width":0.039893616,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.31923383,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"...true) ??","depth":11,"bounds":{"left":0.5340758,"top":0.339585,"width":0.020279255,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":SpolicyName = $body","depth":11,"bounds":{"left":0.55502,"top":0.339585,"width":0.045545213,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"'policyName'","depth":12,"bounds":{"left":0.6008976,"top":0.339585,"width":0.026097074,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?? Sbody","depth":11,"bounds":{"left":0.62732714,"top":0.339585,"width":0.019614361,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"'policy'","depth":12,"bounds":{"left":0.64727396,"top":0.339585,"width":0.014461436,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?? null:Map pollcy names to retry delaysif (SpolicvName === 'TEN","depth":11,"bounds":{"left":0.66206783,"top":0.339585,"width":0.1349734,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SECONDLY","depth":12,"bounds":{"left":0.79737365,"top":0.339585,"width":0.022772606,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"_ROLLING' |I SpolicvName === 'ten","depth":11,"bounds":{"left":0.82047874,"top":0.339585,"width":0.07263963,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"secondly","depth":12,"bounds":{"left":0.5344083,"top":0.35514766,"width":0.018118352,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rolling') {","depth":11,"bounds":{"left":0.55285907,"top":0.35514766,"width":0.019281914,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":11,"bounds":{"left":0.57214093,"top":0.35514766,"width":0.038231384,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"bounds":{"left":0.50964093,"top":0.40901837,"width":0.012300532,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 19:10","depth":11,"bounds":{"left":0.5340758,"top":0.3926576,"width":0.020611702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"bounds":{"left":0.55801195,"top":0.3942538,"width":0.010139627,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PhpStorm","depth":12,"bounds":{"left":0.57081115,"top":0.3926576,"width":0.01861702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ faVsco.js – Client.php","depth":11,"bounds":{"left":0.59042555,"top":0.3926576,"width":0.039893616,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.3914605,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"...true) ??","depth":11,"bounds":{"left":0.5340758,"top":0.41181165,"width":0.020279255,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":Snolievlane = Sbod/LUpoltiev/lane:1 22 Shody","depth":11,"bounds":{"left":0.55502,"top":0.41181165,"width":0.09424867,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"LnolieyL1L.22 п11rao nolicy names to retry delav1f SpoLicvName ==='TEN","depth":12,"bounds":{"left":0.64960104,"top":0.41181165,"width":0.14943483,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SECONDLY","depth":13,"bounds":{"left":0.7993683,"top":0.41181165,"width":0.022772606,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ROLLING' |I SpolicvName === 'ten","depth":12,"bounds":{"left":0.8224734,"top":0.41181165,"width":0.07014628,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"secondly","depth":13,"bounds":{"left":0.5344083,"top":0.4273743,"width":0.018118352,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rolling') {Le","depth":12,"bounds":{"left":0.55285907,"top":0.4273743,"width":0.024102394,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":12,"bounds":{"left":0.57696146,"top":0.4273743,"width":0.038065158,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:24","depth":11,"bounds":{"left":0.5008311,"top":0.46488428,"width":0.020777926,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5249335,"top":0.46648043,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.53673536,"top":0.46488428,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5505319,"top":0.46568236,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.46368715,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".","depth":11,"bounds":{"left":0.5008311,"top":0.4840383,"width":0.0013297872,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:23","depth":11,"bounds":{"left":0.5008311,"top":0.5215483,"width":0.020777926,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5249335,"top":0.5231444,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5365692,"top":0.5215483,"width":0.012965426,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5505319,"top":0.5223464,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.5203512,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:22","depth":11,"bounds":{"left":0.5008311,"top":0.56264967,"width":0.020777926,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5249335,"top":0.5642458,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5365692,"top":0.56264967,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5503657,"top":0.5634477,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.5614525,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".","depth":11,"bounds":{"left":0.5008311,"top":0.5818037,"width":0.0013297872,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:22","depth":11,"bounds":{"left":0.5008311,"top":0.61931366,"width":0.020777926,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5249335,"top":0.6209098,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5365692,"top":0.61931366,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5503657,"top":0.6201117,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.6181165,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"'","depth":11,"bounds":{"left":0.5008311,"top":0.63846767,"width":0.0013297872,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:21","depth":11,"bounds":{"left":0.5008311,"top":0.67597765,"width":0.020279255,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.52443486,"top":0.6775738,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.53607047,"top":0.67597765,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.54986703,"top":0.67677575,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.67478055,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:20","depth":11,"bounds":{"left":0.5008311,"top":0.717079,"width":0.020777926,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5249335,"top":0.7186752,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.53673536,"top":0.717079,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5505319,"top":0.7178771,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.7158819,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:19","depth":11,"bounds":{"left":0.5008311,"top":0.7581804,"width":0.020279255,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.52443486,"top":0.75977653,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.53607047,"top":0.7581804,"width":0.012965426,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5500333,"top":0.7589784,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.7569832,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:17","depth":11,"bounds":{"left":0.5008311,"top":0.7992817,"width":0.020113032,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5242686,"top":0.80087787,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5359042,"top":0.7992817,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5497008,"top":0.8000798,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.7980846,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:17","depth":11,"bounds":{"left":0.5008311,"top":0.84038305,"width":0.020113032,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5242686,"top":0.84197927,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5359042,"top":0.84038305,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5497008,"top":0.84118116,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.83918595,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"$","depth":11,"bounds":{"left":0.5008311,"top":0.8595371,"width":0.0026595744,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:17","depth":11,"bounds":{"left":0.5008311,"top":0.8970471,"width":0.020113032,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5242686,"top":0.89864326,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5359042,"top":0.8970471,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5497008,"top":0.89784515,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.89584994,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":";","depth":11,"bounds":{"left":0.5008311,"top":0.9162011,"width":0.0013297872,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:17","depth":11,"bounds":{"left":0.5008311,"top":0.9537111,"width":0.020113032,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.5242686,"top":0.95530725,"width":0.008976064,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.5359042,"top":0.9537111,"width":0.012799202,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5497008,"top":0.9545092,"width":0.006150266,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":0.952514,"width":0.022606382,"height":0.014764565},"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"=","depth":11,"bounds":{"left":0.5008311,"top":0.9728651,"width":0.0026595744,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:16","depth":11,"bounds":{"left":0.5008311,"top":1.0,"width":0.020279255,"height":-0.010375142},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.52443486,"top":1.0,"width":0.008976064,"height":-0.011971235},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.53607047,"top":1.0,"width":0.012965426,"height":-0.010375142},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5500333,"top":1.0,"width":0.006150266,"height":-0.011173129},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":1.0,"width":0.022606382,"height":-0.009177923},"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":":","depth":11,"bounds":{"left":0.5008311,"top":1.0,"width":0.0013297872,"height":-0.029529095},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:16","depth":11,"bounds":{"left":0.5008311,"top":1.0,"width":0.020279255,"height":-0.06703913},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"bounds":{"left":0.52443486,"top":1.0,"width":0.008976064,"height":-0.068635225},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"bounds":{"left":0.53607047,"top":1.0,"width":0.012965426,"height":-0.06703913},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"bounds":{"left":0.5500333,"top":1.0,"width":0.006150266,"height":-0.06783724},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"bounds":{"left":0.8784907,"top":1.0,"width":0.022606382,"height":-0.06584203},"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:15","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:15","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:14","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:14","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:10","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:09","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":false,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
8893736400600508105
|
8428041027538893097
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/
2026
Calendar
SECONDLY
Search
AND also
second required term — both must appear in same result (optional)
Source
App
Date
dd
/
mm
/
yyyy
Calendar
(blank = all dates)
From
--
:
--
To
--
:
--
Only apps
any app (blank = all)
▾
Skip apps
none skipped
▾
FTS tip: single words work best · "exact phrase" · term1 OR term2 · use AND also for required second term · times are in your local timezone · click any result to expand
49 results
▶ video
7 May 19:25
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:SpolicyName = $body
'policyName'
?? Sbody
'policy'
?? null:Map pollcy names to retry delaysif (SpolicvName === 'TEN
SECONDLY
_ROLLING' |I SpolicvName === 'ten
secondly
rolling') {
… (click to expand)
▶ video
7 May 19:10
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:Snolievlane = Sbod/LUpoltiev/lane:1 22 Shody
LnolieyL1L.22 п11rao nolicy names to retry delav1f SpoLicvName ==='TEN
SECONDLY
ROLLING' |I SpolicvName === 'ten
secondly
rolling') {Le
… (click to expand)
7 May 17:24
Typed
Firefox
text
⏱ Timeline
.
7 May 17:23
Typed
Firefox
text
⏱ Timeline
7 May 17:22
Typed
Firefox
text
⏱ Timeline
.
7 May 17:22
Typed
Firefox
text
⏱ Timeline
'
7 May 17:21
Typed
Firefox
text
⏱ Timeline
7 May 17:20
Typed
Firefox
text
⏱ Timeline
7 May 17:19
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox
text
⏱ Timeline
$
7 May 17:17
Typed
Firefox
text
⏱ Timeline
;
7 May 17:17
Typed
Firefox
text
⏱ Timeline
=
7 May 17:16
Typed
Firefox
text
⏱ Timeline
:
7 May 17:16
Typed
Firefox
text
⏱ Timeline
7 May 17:15
Typed
Firefox
text
⏱ Timeline
.
7 May 17:15
Typed
Firefox
text
⏱ Timeline
7 May 17:14
Typed
Firefox
text
⏱ Timeline
7 May 17:14
Typed
Firefox
text
⏱ Timeline
.
7 May 17:10
Typed
Firefox
text
⏱ Timeline
7 May 17:09
Typed
Firefox
text
⏱ Timeline...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
17492
|
772
|
41
|
2026-05-11T10:24:27.405256+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778495067405_m1.jpg...
|
Firefox
|
Screenpipe — Archive — Personal
|
True
|
app.screenpipe.lakylak.xyz
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/
2026
Calendar
SECONDLY
Search
AND also
second required term — both must appear in same result (optional)
Source
App
Date
dd
/
mm
/
yyyy
Calendar
(blank = all dates)
From
--
:
--
To
--
:
--
Only apps
any app (blank = all)
▾
Skip apps
none skipped
▾
FTS tip: single words work best · "exact phrase" · term1 OR term2 · use AND also for required second term · times are in your local timezone · click any result to expand
49 results
▶ video
7 May 19:25
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:SpolicyName = $body
'policyName'
?? Sbody
'policy'
?? null:Map pollcy names to retry delaysif (SpolicvName === 'TEN
SECONDLY
_ROLLING' |I SpolicvName === 'ten
secondly
rolling') {
… (click to expand)
▶ video
7 May 19:10
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:Snolievlane = Sbod/LUpoltiev/lane:1 22 Shody
LnolieyL1L.22 п11rao nolicy names to retry delav1f SpoLicvName ==='TEN
SECONDLY
ROLLING' |I SpolicvName === 'ten
secondly
rolling') {Le
… (click to expand)
7 May 17:24
Typed
Firefox
text
⏱ Timeline
.
7 May 17:23
Typed
Firefox
text
⏱ Timeline
7 May 17:22
Typed
Firefox
text
⏱ Timeline
.
7 May 17:22
Typed
Firefox
text
⏱ Timeline
'
7 May 17:21
Typed
Firefox
text
⏱ Timeline
7 May 17:20
Typed
Firefox
text
⏱ Timeline
7 May 17:19
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.043402776,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.06631944,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.08958333,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.112847224,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.13611111,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe [archive.db · 12323.6MB]","depth":7,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[archive.db · 12323.6MB]","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"on_screen":true,"help_text":"No audio data in this database","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Timetable","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"07","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"05","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"SECONDLY","depth":8,"on_screen":true,"value":"SECONDLY","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"AND also","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"second required term — both must appear in same result (optional)","depth":8,"on_screen":true,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Source","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"App","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Date","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"dd","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"mm","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"yyyy","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(blank = all dates)","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"From","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Only apps","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"any app (blank = all)","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▾","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Skip apps","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"none skipped","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▾","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"FTS tip: single words work best · \"exact phrase\" · term1 OR term2 · use AND also for required second term · times are in your local timezone · click any result to expand","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"49 results","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 19:25","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PhpStorm","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ faVsco.js – Client.php","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"...true) ??","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":SpolicyName = $body","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"'policyName'","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?? Sbody","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"'policy'","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"?? null:Map pollcy names to retry delaysif (SpolicvName === 'TEN","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SECONDLY","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"_ROLLING' |I SpolicvName === 'ten","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"secondly","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rolling') {","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"▶ video","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 19:10","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screen","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PhpStorm","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/ faVsco.js – Client.php","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"...true) ??","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":Snolievlane = Sbod/LUpoltiev/lane:1 22 Shody","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"LnolieyL1L.22 п11rao nolicy names to retry delav1f SpoLicvName ==='TEN","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SECONDLY","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ROLLING' |I SpolicvName === 'ten","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"secondly","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"rolling') {Le","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"… (click to expand)","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:24","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:23","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:22","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":".","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:22","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"'","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 17:21","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:20","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:19","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:17","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"text","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏱ Timeline","depth":10,"on_screen":true,"help_text":"Open in Timetable","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"7 May 17:17","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Typed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
7707278167204060441
|
8427495669637299499
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/
2026
Calendar
SECONDLY
Search
AND also
second required term — both must appear in same result (optional)
Source
App
Date
dd
/
mm
/
yyyy
Calendar
(blank = all dates)
From
--
:
--
To
--
:
--
Only apps
any app (blank = all)
▾
Skip apps
none skipped
▾
FTS tip: single words work best · "exact phrase" · term1 OR term2 · use AND also for required second term · times are in your local timezone · click any result to expand
49 results
▶ video
7 May 19:25
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:SpolicyName = $body
'policyName'
?? Sbody
'policy'
?? null:Map pollcy names to retry delaysif (SpolicvName === 'TEN
SECONDLY
_ROLLING' |I SpolicvName === 'ten
secondly
rolling') {
… (click to expand)
▶ video
7 May 19:10
Screen
PhpStorm
/ faVsco.js – Client.php
⏱ Timeline
...true) ??
:Snolievlane = Sbod/LUpoltiev/lane:1 22 Shody
LnolieyL1L.22 п11rao nolicy names to retry delav1f SpoLicvName ==='TEN
SECONDLY
ROLLING' |I SpolicvName === 'ten
secondly
rolling') {Le
… (click to expand)
7 May 17:24
Typed
Firefox
text
⏱ Timeline
.
7 May 17:23
Typed
Firefox
text
⏱ Timeline
7 May 17:22
Typed
Firefox
text
⏱ Timeline
.
7 May 17:22
Typed
Firefox
text
⏱ Timeline
'
7 May 17:21
Typed
Firefox
text
⏱ Timeline
7 May 17:20
Typed
Firefox
text
⏱ Timeline
7 May 17:19
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox
text
⏱ Timeline
7 May 17:17
Typed
Firefox...
|
17490
|
NULL
|
NULL
|
NULL
|
|
17710
|
777
|
41
|
2026-05-11T10:30:15.619563+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778495415619_m2.jpg...
|
Firefox
|
Screenpipe — Archive — Personal
|
True
|
app.screenpipe.lakylak.xyz
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/
2026
Calendar
Monitor
Jump to
--
:
--
Go
APP TIMELINE · CLICK TO PLAY · DRAG SCROLLBAR TO PAN
−
1×
+
Follow
Follow
10:00
10:30
11:00
11:30
12:00
12:30
13:00
13:30
14:00
14:30
15:00
15:30
16:00
16:30
17:00
17:30
18:00
18:30
19:00
19:30
20:00
20:30
21:00
21:30
7 May 15:32 · PhpStorm / faVsco.js – OpportunitySyncTrait.php
⏮ 30s
◀ 10s
⏸ Pause
10s ▶
30s ⏭
15:32
iTerm2
Firefox
CleanShot X
Finder
QuickTime Player
PhpStorm
Music
Control Centre
Claude
Slack
Alfred
Raycast
System Information...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.2942154,"top":0.0518755,"width":0.113696806,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.3075133,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.2942154,"top":0.08459697,"width":0.113696806,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.3075133,"top":0.09577015,"width":0.037898935,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.3956117,"top":0.09177973,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.29704124,"top":0.118914604,"width":0.108211435,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.29704124,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.30801198,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.31914893,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.3302859,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.3414229,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe [archive.db · 12323.6MB]","depth":7,"bounds":{"left":0.41456118,"top":0.061452515,"width":0.06698803,"height":0.017956903},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"bounds":{"left":0.41456118,"top":0.06304868,"width":0.027759308,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[archive.db · 12323.6MB]","depth":9,"bounds":{"left":0.44365028,"top":0.06703911,"width":0.037898935,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"bounds":{"left":0.48620346,"top":0.059856344,"width":0.024767287,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"bounds":{"left":0.51163566,"top":0.059856344,"width":0.023769947,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"bounds":{"left":0.53607047,"top":0.059856344,"width":0.020944148,"height":0.0207502},"on_screen":true,"help_text":"No audio data in this database","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"bounds":{"left":0.55767953,"top":0.059856344,"width":0.03507314,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Timetable","depth":7,"bounds":{"left":0.5934175,"top":0.059856344,"width":0.029753989,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"bounds":{"left":0.62383646,"top":0.059856344,"width":0.034075797,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"bounds":{"left":0.93849736,"top":0.0650439,"width":0.008144947,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"07","depth":9,"bounds":{"left":0.9552859,"top":0.06464485,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"bounds":{"left":0.96110374,"top":0.06464485,"width":0.0023271276,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"05","depth":9,"bounds":{"left":0.9644282,"top":0.06464485,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"bounds":{"left":0.970246,"top":0.06464485,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":9,"bounds":{"left":0.9737367,"top":0.06464485,"width":0.009474734,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":8,"bounds":{"left":0.98454124,"top":0.0650439,"width":0.0051529254,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Monitor","depth":9,"bounds":{"left":0.4945146,"top":0.10853951,"width":0.013464096,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jump to","depth":9,"bounds":{"left":0.8530585,"top":0.10853951,"width":0.01412899,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.87317157,"top":0.10814046,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":":","depth":9,"bounds":{"left":0.87898934,"top":0.10814046,"width":0.0023271276,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"--","depth":10,"bounds":{"left":0.88231385,"top":0.10814046,"width":0.0048204786,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Go","depth":8,"bounds":{"left":0.90109706,"top":0.10454908,"width":0.012300532,"height":0.018754989},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"APP TIMELINE · CLICK TO PLAY · DRAG SCROLLBAR TO PAN","depth":10,"bounds":{"left":0.49950132,"top":0.14964086,"width":0.10571808,"height":0.009976057},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"−","depth":9,"bounds":{"left":0.8558843,"top":0.1452514,"width":0.009807181,"height":0.018754989},"on_screen":true,"help_text":"Zoom out","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1×","depth":10,"bounds":{"left":0.86984706,"top":0.14924182,"width":0.004155585,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"+","depth":9,"bounds":{"left":0.87832445,"top":0.1452514,"width":0.009640957,"height":0.018754989},"on_screen":true,"help_text":"Zoom in","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Follow","depth":10,"bounds":{"left":0.8912899,"top":0.14924182,"width":0.004654255,"height":0.011173184},"on_screen":true,"help_text":"","role_description":"checkbox","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Follow","depth":10,"bounds":{"left":0.89727396,"top":0.14924182,"width":0.011136968,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"10:00","depth":13,"bounds":{"left":0.50482047,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"10:30","depth":13,"bounds":{"left":0.5219415,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11:00","depth":13,"bounds":{"left":0.539395,"top":0.21947326,"width":0.0076462766,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11:30","depth":13,"bounds":{"left":0.55651593,"top":0.21947326,"width":0.0076462766,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12:00","depth":13,"bounds":{"left":0.5734708,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12:30","depth":13,"bounds":{"left":0.5905917,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"13:00","depth":13,"bounds":{"left":0.607879,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"13:30","depth":13,"bounds":{"left":0.625,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:00","depth":13,"bounds":{"left":0.642121,"top":0.21947326,"width":0.00831117,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14:30","depth":13,"bounds":{"left":0.65924203,"top":0.21947326,"width":0.00831117,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:00","depth":13,"bounds":{"left":0.6765292,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15:30","depth":13,"bounds":{"left":0.69365025,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16:00","depth":13,"bounds":{"left":0.71077126,"top":0.21947326,"width":0.00831117,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16:30","depth":13,"bounds":{"left":0.7280585,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:00","depth":13,"bounds":{"left":0.7453458,"top":0.21947326,"width":0.007978723,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17:30","depth":13,"bounds":{"left":0.7624667,"top":0.21947326,"width":0.007978723,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18:00","depth":13,"bounds":{"left":0.77958775,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18:30","depth":13,"bounds":{"left":0.79670876,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"19:00","depth":13,"bounds":{"left":0.8138298,"top":0.21947326,"width":0.00831117,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"19:30","depth":13,"bounds":{"left":0.83111703,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20:00","depth":13,"bounds":{"left":0.8479056,"top":0.21947326,"width":0.008643617,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20:30","depth":13,"bounds":{"left":0.86519283,"top":0.21947326,"width":0.008643617,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"21:00","depth":13,"bounds":{"left":0.88248,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"21:30","depth":13,"bounds":{"left":0.8997673,"top":0.21947326,"width":0.008144947,"height":0.008778931},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7 May 15:32 · PhpStorm / faVsco.js – OpportunitySyncTrait.php","depth":10,"bounds":{"left":0.49817154,"top":0.2661612,"width":0.11801862,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"⏮ 30s","depth":9,"bounds":{"left":0.49883643,"top":0.7186752,"width":0.023936171,"height":0.02434158},"on_screen":true,"help_text":"Ctrl+←","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"◀ 10s","depth":9,"bounds":{"left":0.52543217,"top":0.71907425,"width":0.02244016,"height":0.023942538},"on_screen":true,"help_text":"←","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"⏸ Pause","depth":9,"bounds":{"left":0.5505319,"top":0.7186752,"width":0.027925532,"height":0.02434158},"on_screen":true,"help_text":"Space","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXButton","text":"10s ▶","depth":9,"bounds":{"left":0.58111703,"top":0.71907425,"width":0.022273935,"height":0.023942538},"on_screen":true,"help_text":"→","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"30s ⏭","depth":9,"bounds":{"left":0.60605055,"top":0.7186752,"width":0.024102394,"height":0.02434158},"on_screen":true,"help_text":"Ctrl+→","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"15:32","depth":10,"bounds":{"left":0.89943486,"top":0.7254589,"width":0.009640957,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"iTerm2","depth":9,"bounds":{"left":0.49950132,"top":0.7609737,"width":0.011801862,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Firefox","depth":9,"bounds":{"left":0.51961434,"top":0.7609737,"width":0.011801862,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"CleanShot X","depth":9,"bounds":{"left":0.5397274,"top":0.7609737,"width":0.021609042,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finder","depth":9,"bounds":{"left":0.5696476,"top":0.7609737,"width":0.010970744,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"QuickTime Player","depth":9,"bounds":{"left":0.58892953,"top":0.7609737,"width":0.030086435,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"PhpStorm","depth":9,"bounds":{"left":0.62732714,"top":0.7609737,"width":0.017287234,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Music","depth":9,"bounds":{"left":0.65292555,"top":0.7609737,"width":0.010305851,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Control Centre","depth":9,"bounds":{"left":0.6715425,"top":0.7609737,"width":0.025598405,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Claude","depth":9,"bounds":{"left":0.70545214,"top":0.7609737,"width":0.012134309,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Slack","depth":9,"bounds":{"left":0.7258976,"top":0.7609737,"width":0.009474734,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Alfred","depth":9,"bounds":{"left":0.7436835,"top":0.7609737,"width":0.010472074,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Raycast","depth":9,"bounds":{"left":0.7624667,"top":0.7609737,"width":0.013630319,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"System Information","depth":9,"bounds":{"left":0.7844083,"top":0.7609737,"width":0.033909574,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-1704693847920765753
|
2760904663861920413
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/
2026
Calendar
Monitor
Jump to
--
:
--
Go
APP TIMELINE · CLICK TO PLAY · DRAG SCROLLBAR TO PAN
−
1×
+
Follow
Follow
10:00
10:30
11:00
11:30
12:00
12:30
13:00
13:30
14:00
14:30
15:00
15:30
16:00
16:30
17:00
17:30
18:00
18:30
19:00
19:30
20:00
20:30
21:00
21:30
7 May 15:32 · PhpStorm / faVsco.js – OpportunitySyncTrait.php
⏮ 30s
◀ 10s
⏸ Pause
10s ▶
30s ⏭
15:32
iTerm2
Firefox
CleanShot X
Finder
QuickTime Player
PhpStorm
Music
Control Centre
Claude
Slack
Alfred
Raycast
System Information...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
17759
|
776
|
41
|
2026-05-11T10:32:08.999582+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778495528999_m1.jpg...
|
PhpStorm
|
faVsco.js – Kernel.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...
|
[{"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}]...
|
-3367139436975185842
|
-8780819654538876030
|
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
SlackFileEditViewGoHistoryWindowHelpDOCKERO ₴1DEV (docker)Last login: Sun May 10 21:10:26 on ttys013₴2APP (-zsh)883Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ l-zshHomeDMsActivityFilesLater..•MoreallEDJiminny ...clusticclllus+ More unreads## jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...• Direct messages®. Aneliya Angelova. Galya DimitrovaP Petko Kashinskiã. Stefka Stoyanova€. Vasil Vasilev 0. Nikolay IvanovAneliya Angelova, ...2 Stoyan Tanev•. Ves8. Lukas Kovalik y...::: AppsToastJira CloudGoogle Cale...Support Daily - in 1h 28 m100% <78• Mon 11 May 13:32:08Describe what you are looking forAneliya Angelova6 0MessagesAdd canvasO Files+чuле да сс мордиnс anо viма approveTuesday, April 28th~Lukas Kova..те са някави flanky че при мен минават, ще гиоправяза деплой обаче не знамAneliya Angelova 5:14 PMзащоLukas Kovalik 5:15 PMами дали ще усепя да гледамAneliya Angelova 5:16 PMи за двете ли говоришLukas Kovalik 5:16 PMами ще го деплойна но ако нещо грьмнеAneliya Angelova 5:17 PMаа разбрахтеГаля каза че не се използва фичьраи няма проблем да грьмнеToday ~NewAneliya Angelova 1:24 PMЛукаш за Hubspot за синковете вече се използватази команда нали?crm: sync-hubspot-objectsMessage Aneliya Angelova..•...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
17925
|
780
|
41
|
2026-05-11T10:41:45.479493+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778496105479_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
3
68
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,
'policy' => $this->parsePolicy($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
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));
return 5;
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;
}
}
$policy = $this->parsePolicy($e);
if ($policy === 'TEN_SECONDLY_ROLLING') {
return 10;
}
if ($policy === 'SECONDLY') {
return 1;
}
if ($policy === 'DAILY_LIMIT') {
return 600;
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
public function parsePolicy(Throwable $e): ?string
{
if (! method_exists($e, 'getResponseBody')) {
return null;
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return null;
}
$policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
return is_string($policy) ? strtoupper($policy) : null;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"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":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"68","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 'policy' => $this->parsePolicy($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 \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));\n return 5;\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 $policy = $this->parsePolicy($e);\n if ($policy === 'TEN_SECONDLY_ROLLING') {\n return 10;\n }\n if ($policy === 'SECONDLY') {\n return 1;\n }\n if ($policy === 'DAILY_LIMIT') {\n return 600;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\n }\n\n public function parsePolicy(Throwable $e): ?string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return null;\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 null;\n }\n\n $policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n return is_string($policy) ? strtoupper($policy) : null;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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 'policy' => $this->parsePolicy($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 \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));\n return 5;\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 $policy = $this->parsePolicy($e);\n if ($policy === 'TEN_SECONDLY_ROLLING') {\n return 10;\n }\n if ($policy === 'SECONDLY') {\n return 1;\n }\n if ($policy === 'DAILY_LIMIT') {\n return 600;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\n }\n\n public function parsePolicy(Throwable $e): ?string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return null;\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 null;\n }\n\n $policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n return is_string($policy) ? strtoupper($policy) : null;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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":"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":"19","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-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","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}]...
|
-6243931637791501581
|
6378618611371477092
|
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
3
68
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,
'policy' => $this->parsePolicy($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
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));
return 5;
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;
}
}
$policy = $this->parsePolicy($e);
if ($policy === 'TEN_SECONDLY_ROLLING') {
return 10;
}
if ($policy === 'SECONDLY') {
return 1;
}
if ($policy === 'DAILY_LIMIT') {
return 600;
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
public function parsePolicy(Throwable $e): ?string
{
if (! method_exists($e, 'getResponseBody')) {
return null;
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return null;
}
$policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
return is_string($policy) ? strtoupper($policy) : null;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
17923
|
NULL
|
NULL
|
NULL
|
|
17929
|
781
|
41
|
2026-05-11T10:42:00.787768+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778496120787_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
3
68
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,
'policy' => $this->parsePolicy($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
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));
return 5;
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;
}
}
$policy = $this->parsePolicy($e);
if ($policy === 'TEN_SECONDLY_ROLLING') {
return 10;
}
if ($policy === 'SECONDLY') {
return 1;
}
if ($policy === 'DAILY_LIMIT') {
return 600;
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
public function parsePolicy(Throwable $e): ?string
{
if (! method_exists($e, 'getResponseBody')) {
return null;
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return null;
}
$policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
return is_string($policy) ? strtoupper($policy) : null;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"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":"3","depth":4,"bounds":{"left":0.5515292,"top":0.15003991,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"68","depth":4,"bounds":{"left":0.56150264,"top":0.15003991,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.5738032,"top":0.15003991,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.5834442,"top":0.14844373,"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.59075797,"top":0.14844373,"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 'policy' => $this->parsePolicy($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 \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));\n return 5;\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 $policy = $this->parsePolicy($e);\n if ($policy === 'TEN_SECONDLY_ROLLING') {\n return 10;\n }\n if ($policy === 'SECONDLY') {\n return 1;\n }\n if ($policy === 'DAILY_LIMIT') {\n return 600;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\n }\n\n public function parsePolicy(Throwable $e): ?string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return null;\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 null;\n }\n\n $policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n return is_string($policy) ? strtoupper($policy) : null;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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 'policy' => $this->parsePolicy($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 \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));\n return 5;\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 $policy = $this->parsePolicy($e);\n if ($policy === 'TEN_SECONDLY_ROLLING') {\n return 10;\n }\n if ($policy === 'SECONDLY') {\n return 1;\n }\n if ($policy === 'DAILY_LIMIT') {\n return 600;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [\n 'exception_class' => get_class($e),\n ]);\n\n return 10;\n }\n\n public function parsePolicy(Throwable $e): ?string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return null;\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 null;\n }\n\n $policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;\n\n return is_string($policy) ? strtoupper($policy) : null;\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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(\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":"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":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"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.074221864,"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-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.61702126,"top":0.0726257,"width":0.38297874,"height":0.9066241},"on_screen":true,"lines":[{"char_start":273,"char_count":32,"bounds":{"left":0.61702126,"top":0.0,"width":0.080119684,"height":0.014365523}},{"char_start":305,"char_count":79,"bounds":{"left":0.61702126,"top":0.0,"width":0.20212767,"height":0.014365523}},{"char_start":384,"char_count":18,"bounds":{"left":0.61702126,"top":0.0,"width":0.043882977,"height":0.014365523}},{"char_start":402,"char_count":21,"bounds":{"left":0.61702126,"top":0.0,"width":0.051861703,"height":0.014365523}},{"char_start":423,"char_count":48,"bounds":{"left":0.61702126,"top":0.0,"width":0.12167553,"height":0.014365523}},{"char_start":471,"char_count":72,"bounds":{"left":0.61702126,"top":0.0015961692,"width":0.18384309,"height":0.014365523}},{"char_start":543,"char_count":40,"bounds":{"left":0.61702126,"top":0.01915403,"width":0.10106383,"height":0.014365523}},{"char_start":583,"char_count":41,"bounds":{"left":0.61702126,"top":0.03671189,"width":0.10372341,"height":0.014365523}},{"char_start":624,"char_count":72,"bounds":{"left":0.61702126,"top":0.054269753,"width":0.18384309,"height":0.014365523}},{"char_start":696,"char_count":219,"bounds":{"left":0.61702126,"top":0.07182761,"width":0.38297874,"height":0.014365523}},{"char_start":915,"char_count":83,"bounds":{"left":0.61702126,"top":0.08938547,"width":0.21243352,"height":0.014365523}},{"char_start":998,"char_count":20,"bounds":{"left":0.61702126,"top":0.10694334,"width":0.04920213,"height":0.014365523}},{"char_start":1018,"char_count":17,"bounds":{"left":0.61702126,"top":0.1245012,"width":0.041223403,"height":0.014365523}},{"char_start":1035,"char_count":203,"bounds":{"left":0.61702126,"top":0.14205906,"width":0.38297874,"height":0.014365523}},{"char_start":1238,"char_count":22,"bounds":{"left":0.61702126,"top":0.15961692,"width":0.05418883,"height":0.014365523}},{"char_start":1260,"char_count":23,"bounds":{"left":0.61702126,"top":0.17717478,"width":0.056848403,"height":0.014365523}},{"char_start":1283,"char_count":10,"bounds":{"left":0.61702126,"top":0.19473264,"width":0.023271276,"height":0.014365523}},{"char_start":1293,"char_count":27,"bounds":{"left":0.61702126,"top":0.2122905,"width":0.06715426,"height":0.014365523}},{"char_start":1320,"char_count":26,"bounds":{"left":0.61702126,"top":0.22984837,"width":0.06482713,"height":0.014365523}},{"char_start":1346,"char_count":23,"bounds":{"left":0.61702126,"top":0.24740623,"width":0.056848403,"height":0.014365523}},{"char_start":1369,"char_count":28,"bounds":{"left":0.61702126,"top":0.26496407,"width":0.06981383,"height":0.014365523}},{"char_start":1397,"char_count":57,"bounds":{"left":0.61702126,"top":0.28252193,"width":0.14494681,"height":0.014365523}}],"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","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}]...
|
-6243931637791501581
|
6378618611371477092
|
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
3
68
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,
'policy' => $this->parsePolicy($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
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$e ' . PHP_EOL . print_r($e, true));
return 5;
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;
}
}
$policy = $this->parsePolicy($e);
if ($policy === 'TEN_SECONDLY_ROLLING') {
return 10;
}
if ($policy === 'SECONDLY') {
return 1;
}
if ($policy === 'DAILY_LIMIT') {
return 600;
}
$this->log->warning('[Hubspot] No retry-after header or policy name found, using default', [
'exception_class' => get_class($e),
]);
return 10;
}
public function parsePolicy(Throwable $e): ?string
{
if (! method_exists($e, 'getResponseBody')) {
return null;
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return null;
}
$policy = $body['policyName'] ?? $body['policy'] ?? $body['context']['policyName'] ?? null;
return is_string($policy) ? strtoupper($policy) : null;
}
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->executeRequest(fn () => $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$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);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
17927
|
NULL
|
NULL
|
NULL
|
|
18030
|
783
|
41
|
2026-05-11T10:46:03.282793+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778496363282_m2.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
VIeWWindowCode diff review vt/Service.onp" sup VIeWWindowCode diff review vt/Service.onp" suppont Dally • In 1h 14 m100% Lz• Mon 11 May 13:46:03« console (PROD]* console (EUl& console [STAGINGIw.19AO, Chat*= Cowork+ New chatã Projectso0 Arutacts₴ CustomizeBu garian cit zenshio aoolication proces:Dawarich location tracking projectHubspot Badkequest headers debuggin.Screenpipe svnc script tailing after receiMonthly expense trackingExporting transaction data from NotionHow much have I spent for groc…April 2026 spending by categoryCode dift reviewHubSpot rate limit imolementation strateScreenpipe retention policy code locaticViewing retention policy in screenpipeClean snot x video recording terminaticHubSpot rate limit handling with executeUntitledg Screen pipe. Is there ability…SMB mount access inconsistency betwea What is the hect switch Icanrermission deniea on screenpipe volumScreenpipe sync database attachment eLast swimming outing with DanDefinition of incarcerated• RATE LIMITIounerwise une aererea draneh wil nerany never execure and tne cleanuo comment decomes aSmaller stuft:• Throwable became Throwable -makesure use Throwable: was added at the top ofthe flle, otherwise it'll fatal on the catch• The block comment now lives inside the if (isDeleted) branch, which reads fine and isgenuinely better documentation than the old code had. Nice touch• The try/catch only wraps the update path, same as before — consistent, not aregressionbility winore approving -nimbortant soth© PaginationConfig.phpA3 A70 V3 A• HubSpot rate limit implementation strategv@ HubSnot rate limit handling with eyecuteReauestPast monthi@ Loop execution and error handling in polling cyclePast yeaPast veaPast veaPast veavou think aboutLeaknhutt theand manuallv unsetcously instantiatesnew Document obiects and adds them to $documentsToUpdate and IDstoSdocumentsobelete).= custom.log X=laravel.log4 SF [jiminny@localhost]& HS_local [jiminny@localhost][2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Date":["Thu,07 May 2026 14:21:15 GMT"],"Content-Type":["application/json;charset=utf-8"]."Transfer-Encoding": ["chunked"],"conneccion". Keep-alive"n"CF-Ray": ["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":"DYNAMIC"]"Strict-Transport-Secur1ty":"max-aqe=31536000* 1ncLudesubDomains: preload")accept-encoding"],"access-control-allow-credentials": "false")."server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",cfn:desc="9-80de8ercodcSa-TAD"'"x-content-type-options": ["nosniff"]."x-hubsoot-correlation-id":"019e02d0-6fd8-7812-bdba-885b7ccb3ee3"]"Set-Cookie":["__cf_bm=S1UrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-r1.ZggtDKxTge5zr8_2gbBfW100.ufZEXDZyHz2mBUFdzdo2gTHEs0,07-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f","endnoints".?\"url\":\"https:|V/\V/a.nel.cloudflare.com/\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZLzoYdxI%2BIxVpHmsKn30%2BKVA3mFIJ2m7YRECDGS\"group\":\"cf-nel\",\"max_age\":604800}"],"success_fraction\":0.01,"nenont to":"cf-nel"\"max_age\":604800}"],"Server": ["cloudflare"]}} {"correlation id":"95236535-ec98-4541-b92a-adfa73b69eab"."trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}Evaluated reviewer critiques, distinguished regressions from preexisting issues ›Mostlv thoughtful but the framing on (A) is wrong, and there's a real point being made on B)that deserves more weight than the others. Going through them:**A - Infinite Accumulation: overstated and misattributed to this PR.** Look back at the oldcode: documentst ou pdate'and'documentstoDelete are captured by use(...) in thechunk callback and accumulated across all chunks. then returned. The new code does theevaet came thing Whatever the accumuilation hehavior of this method is it'cidenticalheforeandafter the diff. The reviewer is calling out a pre-existing architectural choice as if therefactor introduced it. The bit about "manually unsetting " $entityModel'" also looks like it'sreferring to code that isn't actuallv in the diff —'nursor()' drons references between vieldsautomatically: you don't need an explicit' unse V o either the reviewer is describing codethat exists elsewhere in the file/method. or thev're imagining it. If the accumulation isWrite a message…MTN 1Opus 4.7 Adaptiveik tukas. ProCiaudo ic Aland can mako mictakac Plence double-chock recnoncodW Windsurf Teams 20-17UTF.Rfo 4 spaces 0...
|
NULL
|
1816756204008117924
|
NULL
|
click
|
ocr
|
NULL
|
VIeWWindowCode diff review vt/Service.onp" sup VIeWWindowCode diff review vt/Service.onp" suppont Dally • In 1h 14 m100% Lz• Mon 11 May 13:46:03« console (PROD]* console (EUl& console [STAGINGIw.19AO, Chat*= Cowork+ New chatã Projectso0 Arutacts₴ CustomizeBu garian cit zenshio aoolication proces:Dawarich location tracking projectHubspot Badkequest headers debuggin.Screenpipe svnc script tailing after receiMonthly expense trackingExporting transaction data from NotionHow much have I spent for groc…April 2026 spending by categoryCode dift reviewHubSpot rate limit imolementation strateScreenpipe retention policy code locaticViewing retention policy in screenpipeClean snot x video recording terminaticHubSpot rate limit handling with executeUntitledg Screen pipe. Is there ability…SMB mount access inconsistency betwea What is the hect switch Icanrermission deniea on screenpipe volumScreenpipe sync database attachment eLast swimming outing with DanDefinition of incarcerated• RATE LIMITIounerwise une aererea draneh wil nerany never execure and tne cleanuo comment decomes aSmaller stuft:• Throwable became Throwable -makesure use Throwable: was added at the top ofthe flle, otherwise it'll fatal on the catch• The block comment now lives inside the if (isDeleted) branch, which reads fine and isgenuinely better documentation than the old code had. Nice touch• The try/catch only wraps the update path, same as before — consistent, not aregressionbility winore approving -nimbortant soth© PaginationConfig.phpA3 A70 V3 A• HubSpot rate limit implementation strategv@ HubSnot rate limit handling with eyecuteReauestPast monthi@ Loop execution and error handling in polling cyclePast yeaPast veaPast veaPast veavou think aboutLeaknhutt theand manuallv unsetcously instantiatesnew Document obiects and adds them to $documentsToUpdate and IDstoSdocumentsobelete).= custom.log X=laravel.log4 SF [jiminny@localhost]& HS_local [jiminny@localhost][2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Date":["Thu,07 May 2026 14:21:15 GMT"],"Content-Type":["application/json;charset=utf-8"]."Transfer-Encoding": ["chunked"],"conneccion". Keep-alive"n"CF-Ray": ["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":"DYNAMIC"]"Strict-Transport-Secur1ty":"max-aqe=31536000* 1ncLudesubDomains: preload")accept-encoding"],"access-control-allow-credentials": "false")."server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",cfn:desc="9-80de8ercodcSa-TAD"'"x-content-type-options": ["nosniff"]."x-hubsoot-correlation-id":"019e02d0-6fd8-7812-bdba-885b7ccb3ee3"]"Set-Cookie":["__cf_bm=S1UrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-r1.ZggtDKxTge5zr8_2gbBfW100.ufZEXDZyHz2mBUFdzdo2gTHEs0,07-May-26 14:51:15 GMT; domain=.hubapi.com; Http0nly; Secure; SameSite=None"],"Renont-To".f","endnoints".?\"url\":\"https:|V/\V/a.nel.cloudflare.com/\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZLzoYdxI%2BIxVpHmsKn30%2BKVA3mFIJ2m7YRECDGS\"group\":\"cf-nel\",\"max_age\":604800}"],"success_fraction\":0.01,"nenont to":"cf-nel"\"max_age\":604800}"],"Server": ["cloudflare"]}} {"correlation id":"95236535-ec98-4541-b92a-adfa73b69eab"."trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}Evaluated reviewer critiques, distinguished regressions from preexisting issues ›Mostlv thoughtful but the framing on (A) is wrong, and there's a real point being made on B)that deserves more weight than the others. Going through them:**A - Infinite Accumulation: overstated and misattributed to this PR.** Look back at the oldcode: documentst ou pdate'and'documentstoDelete are captured by use(...) in thechunk callback and accumulated across all chunks. then returned. The new code does theevaet came thing Whatever the accumuilation hehavior of this method is it'cidenticalheforeandafter the diff. The reviewer is calling out a pre-existing architectural choice as if therefactor introduced it. The bit about "manually unsetting " $entityModel'" also looks like it'sreferring to code that isn't actuallv in the diff —'nursor()' drons references between vieldsautomatically: you don't need an explicit' unse V o either the reviewer is describing codethat exists elsewhere in the file/method. or thev're imagining it. If the accumulation isWrite a message…MTN 1Opus 4.7 Adaptiveik tukas. ProCiaudo ic Aland can mako mictakac Plence double-chock recnoncodW Windsurf Teams 20-17UTF.Rfo 4 spaces 0...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18040
|
782
|
41
|
2026-05-11T10:46:29.713157+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778496389713_m1.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpDOCKERO ₴1DEV SlackFileEditViewGoHistoryWindowHelpDOCKERO ₴1DEV (docker)$2APP (-zsh)883viewsjiminny-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-5:jiminny-worker-processing-5_00:jiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00: stoppedworker-emails:worker-emails_00:worker-nudges:worker-nudges_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00: stoppedworker-crm-sync:worker-crm-sync_00: stoppedartisan-schedule:artisan-schedule_00: stoppedworker-es-update:worker-es-update_00: stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: 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:jiminny-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 MatchActivityCrmData jobs (portal=2)Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.root@docker_lamp_1:/home/jiminny# php artisan jiminny:debugDispatching 100 MatchActivityCrmData jobs (portal=2)Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.root@docker_lamp_1:/home/jiminny# ]DEV (d)-zshHomeDMsActivityFilesLater...MorelallSupport Daily • in 1h 14 m100% <78• Mon 11 May 13:46:29ED→Describe what you are looking forJiminny ...# contusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...ToastHomeMessages^ Direct messages®. Aneliya Angelova®. Galya Dimitrova& Petko Kashinski&. Stefka StoyanovaVasil Vasilev OlC. Nikolay IvanovAneliya Angelova, ...Stoyan Tanev®. VesE Lukas Kovalik y... 0AboutiminnyFriday, May 8th ~Added by Toast for GitHubToday ~Toast APP10:00 AMReviewapp#12059 Jy 20820 es reindexstream model hydration2 days old • 12 files changed •@Vasil VasilevAdded by Toast for GitHubResolve Conflictsapp#11443 Test hublets latency5 months old • 20 files changed#11327 JY-19501 webhookbased opportunity syncShow moreAdded by Toast for GitHubNeeds Loveapp#12024 JY-20773 fix user pilottracking ofr automated reportgenerated12 days old • 1 file changedE:: AppsMessage ToastJira CloudToast+AaConala CalaNew...
|
NULL
|
-4683325064304321063
|
NULL
|
click
|
ocr
|
NULL
|
SlackFileEditViewGoHistoryWindowHelpDOCKERO ₴1DEV SlackFileEditViewGoHistoryWindowHelpDOCKERO ₴1DEV (docker)$2APP (-zsh)883viewsjiminny-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-5:jiminny-worker-processing-5_00:jiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00: stoppedworker-emails:worker-emails_00:worker-nudges:worker-nudges_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00: stoppedworker-crm-sync:worker-crm-sync_00: stoppedartisan-schedule:artisan-schedule_00: stoppedworker-es-update:worker-es-update_00: stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: 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:jiminny-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 MatchActivityCrmData jobs (portal=2)Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.root@docker_lamp_1:/home/jiminny# php artisan jiminny:debugDispatching 100 MatchActivityCrmData jobs (portal=2)Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.root@docker_lamp_1:/home/jiminny# ]DEV (d)-zshHomeDMsActivityFilesLater...MorelallSupport Daily • in 1h 14 m100% <78• Mon 11 May 13:46:29ED→Describe what you are looking forJiminny ...# contusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi...ToastHomeMessages^ Direct messages®. Aneliya Angelova®. Galya Dimitrova& Petko Kashinski&. Stefka StoyanovaVasil Vasilev OlC. Nikolay IvanovAneliya Angelova, ...Stoyan Tanev®. VesE Lukas Kovalik y... 0AboutiminnyFriday, May 8th ~Added by Toast for GitHubToday ~Toast APP10:00 AMReviewapp#12059 Jy 20820 es reindexstream model hydration2 days old • 12 files changed •@Vasil VasilevAdded by Toast for GitHubResolve Conflictsapp#11443 Test hublets latency5 months old • 20 files changed#11327 JY-19501 webhookbased opportunity syncShow moreAdded by Toast for GitHubNeeds Loveapp#12024 JY-20773 fix user pilottracking ofr automated reportgenerated12 days old • 1 file changedE:: AppsMessage ToastJira CloudToast+AaConala CalaNew...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18268
|
791
|
41
|
2026-05-11T11:07:32.836203+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497652836_m2.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
WindowProjectIMMakerleO package-lock.json= ohostan WindowProjectIMMakerleO package-lock.json= ohostan.neon.distEphpstan-baseline.neon<> phounit.xmliTo raw_saLquery.sqlMLRSADMS moộ sonar-project.properties361= test.py<> Untitled Diagram.xmlvetur.config.jsM+ WEBHOOK_FILTERING_IMPLEM 365> (h External Librariesv =* Scratches and Consolesv @ Database ConsolesV AEUA console [EU]4 DEAL RISKS [EU]&DI LUI* SyncCrmEntities Trait.phpC HandleHubsi© RateLimitException.php© CachedCrmServiceDecora© PaginationConfia.phdALu Lu& iminny@localhostconsole liminnvalocalho# DI [jiminny@localhost]4 HS_ocal liminnv@localnc 3764 SF [jiminny@localhost]A zoho dev liminnv@localh 378V ADROnServices+,o,cv O Database• ДEU# consolev & liminny@localnost4HS_Jocal 1 s 665 msA SFV APRODA consoleV A STAGING« console& Dockerclass Jiminnybebuqcommand extends commprivate function natelamitfor ($i = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {scnis"pinto syncing$this->info( string: "Matc)ScrmService->matchByName('R$team = Team: : find($teamId);Sconfio = steam->determconflaunSactivities = Activitv:quervo"id'Outputi Result 2 x(0 W 4 rows -Muser_id YI email Yiames.arahamdiim3 148 (owner)nikolay.nikoloveLukas.kovalik@jihoren.k1razvand• SearchYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissions to see who can edit, or upgrade to restore collaboration.Iteration run Search HS › search contact by email Copyv COLLECtIONSs9: An error occurrea› CRM Owners• CRM Pipelines› Dealsengagements>D OLD ENGAGEMENTSGEt list meetingsrosl search tasksGET read callGeT list callspost meetings scheduledGET det meetinorost det link to task>POST Create Contact with Association› Hubspotv teration run HSGET Read Copyeg. An error occurred.successful operationv teration run Search HSrost search contact oy emall copy> Journal & webhoooks v4› OAuth› Properties• DECCADOLSEARCHPost search contact by phonePOST search contact by emailpost search meetingsPOST search notes> POST Search calls v3POST Search related meetinas v3POST search deals› © Critical System Resource LimitPOSTntps://api.nubapi.com/crm/vs/objects/contacts/searchE Docs Params Authorization • Headers 11 Body • Scripts Settingsnone torm-data x-www-form-urlencoded raw binary Grapngl JSON v1 { "Limit": 1 3Body Cookies 1 Headers 17Toct Pocultel( JSONPreviewSo? Pass the correct auth credentialso". "Tho OAuth token used to make this call expired 30 minute(s) ago.".BO00UauA"2026-05-11T10:36:27.6872"sbeen stopped to prevent systenSustem Resource WarningSustem resources are constrained. Thesystem may not be able to generate the loadeded for this test and the cest is likely to- Connect Git = Concole 5.) TerminaGET Read CopyGET httos:/lapi.hubapi.com40f Preparation for Refi... in 53 m100% Lz• Mon 11 May 14:07:320 Iteration run Search HSD Iteration run Search HSNo environmentvSaveCookies2 Schema BeautifyA01 Unauthorized e 100 mc • 112 KR • Aa ea. Cave Recnonco ...51=908Giobals Vault Tooks •- (=...
|
NULL
|
-6254256667732255640
|
NULL
|
visual_change
|
ocr
|
NULL
|
WindowProjectIMMakerleO package-lock.json= ohostan WindowProjectIMMakerleO package-lock.json= ohostan.neon.distEphpstan-baseline.neon<> phounit.xmliTo raw_saLquery.sqlMLRSADMS moộ sonar-project.properties361= test.py<> Untitled Diagram.xmlvetur.config.jsM+ WEBHOOK_FILTERING_IMPLEM 365> (h External Librariesv =* Scratches and Consolesv @ Database ConsolesV AEUA console [EU]4 DEAL RISKS [EU]&DI LUI* SyncCrmEntities Trait.phpC HandleHubsi© RateLimitException.php© CachedCrmServiceDecora© PaginationConfia.phdALu Lu& iminny@localhostconsole liminnvalocalho# DI [jiminny@localhost]4 HS_ocal liminnv@localnc 3764 SF [jiminny@localhost]A zoho dev liminnv@localh 378V ADROnServices+,o,cv O Database• ДEU# consolev & liminny@localnost4HS_Jocal 1 s 665 msA SFV APRODA consoleV A STAGING« console& Dockerclass Jiminnybebuqcommand extends commprivate function natelamitfor ($i = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {scnis"pinto syncing$this->info( string: "Matc)ScrmService->matchByName('R$team = Team: : find($teamId);Sconfio = steam->determconflaunSactivities = Activitv:quervo"id'Outputi Result 2 x(0 W 4 rows -Muser_id YI email Yiames.arahamdiim3 148 (owner)nikolay.nikoloveLukas.kovalik@jihoren.k1razvand• SearchYour team is now on the Free plan with 1 admin. You retain editing access and other members are read-only. View team permissions to see who can edit, or upgrade to restore collaboration.Iteration run Search HS › search contact by email Copyv COLLECtIONSs9: An error occurrea› CRM Owners• CRM Pipelines› Dealsengagements>D OLD ENGAGEMENTSGEt list meetingsrosl search tasksGET read callGeT list callspost meetings scheduledGET det meetinorost det link to task>POST Create Contact with Association› Hubspotv teration run HSGET Read Copyeg. An error occurred.successful operationv teration run Search HSrost search contact oy emall copy> Journal & webhoooks v4› OAuth› Properties• DECCADOLSEARCHPost search contact by phonePOST search contact by emailpost search meetingsPOST search notes> POST Search calls v3POST Search related meetinas v3POST search deals› © Critical System Resource LimitPOSTntps://api.nubapi.com/crm/vs/objects/contacts/searchE Docs Params Authorization • Headers 11 Body • Scripts Settingsnone torm-data x-www-form-urlencoded raw binary Grapngl JSON v1 { "Limit": 1 3Body Cookies 1 Headers 17Toct Pocultel( JSONPreviewSo? Pass the correct auth credentialso". "Tho OAuth token used to make this call expired 30 minute(s) ago.".BO00UauA"2026-05-11T10:36:27.6872"sbeen stopped to prevent systenSustem Resource WarningSustem resources are constrained. Thesystem may not be able to generate the loadeded for this test and the cest is likely to- Connect Git = Concole 5.) TerminaGET Read CopyGET httos:/lapi.hubapi.com40f Preparation for Refi... in 53 m100% Lz• Mon 11 May 14:07:320 Iteration run Search HSD Iteration run Search HSNo environmentvSaveCookies2 Schema BeautifyA01 Unauthorized e 100 mc • 112 KR • Aa ea. Cave Recnonco ...51=908Giobals Vault Tooks •- (=...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18272
|
790
|
41
|
2026-05-11T11:07:37.356940+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497657356_m1.jpg...
|
Notion Calendar
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ab)Preparation for Refi... in 53 mDEV (docker)-zshDOCKER₴81DEV (docker)₴2APP (-zsh)H3worker-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:worker_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: stoppedworker-emails:worker-emails_00: stoppedworker-audio:worker-audio_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: 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 run jiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# php artisan optimize:clear && supervisorctl restart allINFOClearing cached bootstrap files.configcachecompiledeventsroutesviews84-zshX5screenpipe"100% <8• Mon 11 May 14:07:37181O ₴6-zsh87+DEV59.22ms DONE97.76ms DONE2.63ms DONE4.67ms DONE11.57ms DONE18.54ms DONE...
|
NULL
|
-2635936891633940122
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp$0(ab)Preparation for Refi... in 53 mDEV (docker)-zshDOCKER₴81DEV (docker)₴2APP (-zsh)H3worker-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:worker_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: stoppedworker-emails:worker-emails_00: stoppedworker-audio:worker-audio_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: 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 run jiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# php artisan optimize:clear && supervisorctl restart allINFOClearing cached bootstrap files.configcachecompiledeventsroutesviews84-zshX5screenpipe"100% <8• Mon 11 May 14:07:37181O ₴6-zsh87+DEV59.22ms DONE97.76ms DONE2.63ms DONE4.67ms DONE11.57ms DONE18.54ms DONE...
|
18270
|
NULL
|
NULL
|
NULL
|
|
18646
|
803
|
41
|
2026-05-11T11:37:53.421110+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778499473421_m2.jpg...
|
PhpStorm
|
faVsco.js – RateLimitException.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
<?php
declare(strict_types=1);
namespace Jiminny\Exceptions;
use Throwable;
class RateLimitException extends RuntimeException
{
public function __construct(
string $message = '',
private readonly int $retryAfter = 1,
?Throwable $previous = null,
) {
parent::__construct($message, 0, $previous);
}
public function getRetryAfter(): int
{
return max($this->retryAfter, 1);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
23/38
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight...
|
[{"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":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Exceptions;\n\nuse Throwable;\n\nclass RateLimitException extends RuntimeException\n{\n public function __construct(\n string $message = '',\n private readonly int $retryAfter = 1,\n ?Throwable $previous = null,\n ) {\n parent::__construct($message, 0, $previous);\n }\n\n public function getRetryAfter(): int\n {\n return max($this->retryAfter, 1);\n }\n}","depth":4,"bounds":{"left":0.11968085,"top":0.1963288,"width":0.30585107,"height":0.52673584},"on_screen":true,"lines":[{"char_start":0,"char_count":6,"bounds":{"left":0.11968085,"top":0.0,"width":0.012965426,"height":0.014365523}},{"char_start":7,"char_count":25,"bounds":{"left":0.11968085,"top":0.0,"width":0.06216755,"height":0.014365523}},{"char_start":33,"char_count":30,"bounds":{"left":0.11968085,"top":0.0,"width":0.07513298,"height":0.014365523}},{"char_start":64,"char_count":15,"bounds":{"left":0.11968085,"top":0.019952115,"width":0.036236703,"height":0.014365523}},{"char_start":80,"char_count":50,"bounds":{"left":0.11968085,"top":0.055067837,"width":0.12699468,"height":0.014365523}},{"char_start":130,"char_count":2,"bounds":{"left":0.11968085,"top":0.0726257,"width":0.0026595744,"height":0.014365523}},{"char_start":132,"char_count":33,"bounds":{"left":0.11968085,"top":0.090183556,"width":0.08277926,"height":0.014365523}},{"char_start":165,"char_count":30,"bounds":{"left":0.11968085,"top":0.10774142,"width":0.07513298,"height":0.014365523}},{"char_start":195,"char_count":46,"bounds":{"left":0.11968085,"top":0.12529927,"width":0.11635638,"height":0.014365523}},{"char_start":241,"char_count":37,"bounds":{"left":0.11968085,"top":0.14285715,"width":0.0930851,"height":0.014365523}},{"char_start":278,"char_count":8,"bounds":{"left":0.11968085,"top":0.16041501,"width":0.017952127,"height":0.014365523}},{"char_start":286,"char_count":53,"bounds":{"left":0.11968085,"top":0.17797287,"width":0.14993352,"height":0.014365523}},{"char_start":339,"char_count":6,"bounds":{"left":0.11968085,"top":0.19553073,"width":0.012965426,"height":0.014365523}},{"char_start":346,"char_count":41,"bounds":{"left":0.11968085,"top":0.2482043,"width":0.10372341,"height":0.014365523}},{"char_start":387,"char_count":6,"bounds":{"left":0.11968085,"top":0.26576218,"width":0.012965426,"height":0.014365523}},{"char_start":393,"char_count":42,"bounds":{"left":0.11968085,"top":0.28332004,"width":0.12732713,"height":0.014365523}},{"char_start":435,"char_count":6,"bounds":{"left":0.11968085,"top":0.3008779,"width":0.012965426,"height":0.014365523}},{"char_start":441,"char_count":1,"bounds":{"left":0.11968085,"top":0.31843576,"width":0.0026595744,"height":0.014365523}}],"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Exceptions;\n\nuse Throwable;\n\nclass RateLimitException extends RuntimeException\n{\n public function __construct(\n string $message = '',\n private readonly int $retryAfter = 1,\n ?Throwable $previous = null,\n ) {\n parent::__construct($message, 0, $previous);\n }\n\n public function getRetryAfter(): int\n {\n return max($this->retryAfter, 1);\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.42985374,"top":0.105347164,"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.4424867,"top":0.10454908,"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.45345744,"top":0.10454908,"width":0.043882977,"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.5063165,"top":0.10454908,"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.5162899,"top":0.10454908,"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.5249335,"top":0.10454908,"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.53357714,"top":0.10454908,"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":"23/38","depth":4,"bounds":{"left":0.5472075,"top":0.103751,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.5728058,"top":0.10295291,"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.58144945,"top":0.10295291,"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.5900931,"top":0.10295291,"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.5987367,"top":0.10295291,"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}]...
|
4165343094468765564
|
-3587868567785077950
|
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
<?php
declare(strict_types=1);
namespace Jiminny\Exceptions;
use Throwable;
class RateLimitException extends RuntimeException
{
public function __construct(
string $message = '',
private readonly int $retryAfter = 1,
?Throwable $previous = null,
) {
parent::__construct($message, 0, $previous);
}
public function getRetryAfter(): int
{
return max($this->retryAfter, 1);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
23/38
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight...
|
18644
|
NULL
|
NULL
|
NULL
|
|
18653
|
802
|
41
|
2026-05-11T11:38:48.487188+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778499528487_m1.jpg...
|
PhpStorm
|
faVsco.js – RateLimitException.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ab)& Preparation for Refi... in 22 mDEV (docker)-zshDOCKERcompiledeventsroutesviewsO ₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:j1minny-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-5:jiminny-worker-processing-5_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00:stoppedworker-analytics:worker-analytics_00: stoppedworker-audio:worker-audio_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:worker_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-emails:worker-emails_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: 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:38:48T81-zsh+screenpipe"O ₴61.79ms DONE2.06ms DONE0.85ms DONE4.12ms DONEDEV...
|
NULL
|
4597499315988356833
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ab)& Preparation for Refi... in 22 mDEV (docker)-zshDOCKERcompiledeventsroutesviewsO ₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:j1minny-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-5:jiminny-worker-processing-5_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00:stoppedworker-analytics:worker-analytics_00: stoppedworker-audio:worker-audio_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:worker_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-emails:worker-emails_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: 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:38:48T81-zsh+screenpipe"O ₴61.79ms DONE2.06ms DONE0.85ms DONE4.12ms DONEDEV...
|
18651
|
NULL
|
NULL
|
NULL
|
|
18744
|
805
|
41
|
2026-05-11T11:43:20.806716+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778499800806_m2.jpg...
|
Code
|
Claude Code — app
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 22 pending changes...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 22 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3451916177024458067
|
-325779747493437298
|
click
|
hybrid
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 22 pending changes
Windov# MatchActivitvCrmData.pho MR RateLimitException.php M** HandleHubspotRateLimit.php M ># Client.pho 9, M X# HubspotPaginationService.ohoMapp > Jobs › Middleware › «* HandleHubspotRateLimit.php › * HandleHubspotRateLimitC+40kii."Preparation tor kerl.. In 1/m* 100% C4• &• Mon 11 May 14:43:20.•2 C3 Claude Code XUntitledCaude codenamespace Jiminny\Jobs \MiddLeware;Job middleware that catches RateLimitException from HubSpot API callsand releases the job back to the queue with the appropriate delay.*V APPv appy JobsVCrm# MatchActivitiesToNewOpportunity.phw MatchacuivilvcrmData.onp** NoteObject.phpw SaveActivity.phpwSavelranscription.phpw SetupLavout.php#R [EMAIL]#Suncleads.ono# SyncObjects.php#SvncOpportunities.lob.ohv# SyncOpportunity.php* SvncProfileMetadata.ohoSyncTeamFieldsJob.php18 1#. SvncTeamMetadata.nhnlUpdateOpportunitySpecifications.php" UpdateStage.php› DealRisks> Mailbox> MeetingBotV Middlewarem HandleruospotkateLimit.onpR RateLimited.php> Streamine> TeamTelephony>Usen«* BaseProcessingJob.phpDummyJob.phpmoortRecallA Recordinas.oo.onv#ImoortRemotelrack.Job.ond# .Job.ohp# JobDisoatcher.oho# JobDispatcherinterface.ohv#[EMAIL]#SasVisibilitvControl.ohnv ModelsActivitvi>AF> CalendarTIMELINGiê JY-20725-handle-HS-search-rate-limit*+ Co@2A902private const int MAX_RETRY_DELAY = 600;private const int MIN_RETRY_DELAY = 1;private const int JITTER_SECONDS = 5;public function handle(object $job, callable Snext): voidcrySnext(S1ob} catch (RateLimitException Se) {Sdelay = maxself::MIN RETRY DELAY. min Se->getRetrvAftero, self::MAX RETRY DELAY)):Add iitter to nrevent thunderina herd oroblem bv randomizing retry timesisdelay += random_int(0, self::JITTER_SECONDS);cattennts = cioh_sattemntc/):i€ Ienttomnte #= 2 Il Cottonnte & 10 -=- 0lfLog: : info(' [HandLeHubspotRateLimit) Rate limit caught, releasing job with delay', I= Se->getRetryAfter),"delav' = sdelay.$job->release($delay);You've come to the absolutely riaht place!Prefer the Terminal experience? Switch back in Settings. XReveiw the diff. Mostly @app/Jobs/Crm/MatchActivityCrmData.php,Oann/Eycontionc/Patol imitEycontion.nhnOann/.lobc/Middloware/HandleLuhcnotPatol.imit. ohr" 1 line selected‹> Edit automaticallyg SignInP A...
|
18742
|
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/ /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php...
|
NULL
|
NULL
|
|
18911
|
811
|
41
|
2026-05-11T11:59:50.911354+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778500790911_m2.jpg...
|
Code
|
Review rate limit handli… — app
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 22 pending changes
22
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Testing
Claude Code
EXPLORER
EXPLORER
Explorer Section: app
Explorer Section: app
APP
Handler.php
HttpBadRequestException.php
HttpBadRequestWithErrorReasonException.php
HttpForbiddenException.php
HttpMethodNotAllowedException.php
HttpNotFoundException.php
HttpSessionExpiredException.php
HttpUnauthorizedException.php
HttpUnsupportedFormatException.php
InvalidArgumentException.php
InvalidDataException.php
InvalidEnumException.php
InvalidFileException.php
InvalidTeamSettingException.php
JobTimeoutException.php
LogicException.php
MaxTeamTrialSizeExceededException.php
ModelNotFoundException.php
NoResultsException.php
NotImplementedException.php
NotSupportedException.php
NumberUnavailableException.php
OperationException.php
OutOfBoundsException.php
QuotaExceededException.php
RateLimitException.php
M
RegistrationInvitationMismatchException.php
RequestQueuedForDeferredExecution.php
ResponseException.php
RingCentralException.php
RingCentralExtensionNotFound.php
RuntimeException.php
SequenceNumberException.php
ServiceIntegrationException.php
ServiceUnavailableException.php
SidekickSettingsException.php
SocialAccountNotFoundException.php
SocialAccountTokenInvalidException.php
SyncActivityException.php
TenantIsolationException.php
TextRelayException.php
TooManyFailedActivities.php
TranscriptionNotIndexedException.php
UnexpectedCallException.php
UnexpectedEloquentModelException.php
UnexpectedValueException.php
ZipAttackException.php
FFMpeg
Formats
Exceptions
app
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
MySQL Section
MYSQL
MYSQL
MatchActivityCrmData.php, Editor Group 1
RateLimitException.php, Editor Group 1
HandleHubspotRateLimit.php, Editor Group 1
Client.php, Editor Group 1
HubspotPaginationService.php, Editor Group 1
<?php
declare(strict_types=1);
namespace Jiminny\Exceptions;
use Throwable;
class RateLimitException extends RuntimeException
{
public function __construct(
string $message = '',
private readonly int $retryAfter = 1,
?Throwable $previous = null,
) {
parent::__construct($message, 0, $previous);
}
public function getRetryAfter(): int
{
return max($this->retryAfter, 1);
}
}
<?php
declare(strict_types=1);
namespace Jiminny\Exceptions;
use Throwable;
class RateLimitException extends RuntimeException
{
public function __construct(
string $message = '',
private readonly int $retryAfter = 1,
?Throwable $previous = null,
) {
parent::__construct($message, 0, $previous);
}
public function getRetryAfter(): int
{
return max($this->retryAfter, 1);
}
}
Review rate limit handli…, Editor Group 2
remote
app (Git) - JY-20725-handle-HS-search-rate-limit*+, Checkout Branch/Tag...
JY-20725-handle-HS-search-rate-limit*+
app (Git) - Publish Branch
Errors: 6, Warnings: 9, Infos: 2
6
9
2
Notifications
key, PHP extension: Premium features not active.
Sign In
Sign In
Info: You have Docker installed on your system. Do you want to install the recommended extensions from Microsoft for it?
Clear
Review rate limit handling for HubSpot job queue
Session history
New session
Message actions
RateLimitException.php#9-9
RateLimitException.php#9-9
Reveiw the diff. Mostly
@app/Jobs/Crm/MatchActivityCrmData.php
,
@app/Exceptions/RateLimitException.php
,
@app/Jobs/Middleware/HandleHubspotRateLimit.php
,
@app/Services/Crm/Hubspot/Client.php
and
@app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php
. The issue is I am trying to make sure that instant spike of MatchActivityCrmData jobs willl handle 429 exceptions from hubspot. Revewi ti carefully and try to see potential issues and bottlenecks. Also RateLimitException was changerd from LogicException to RuntimeException. Is it ok. This exception is used by other paerts of code. Will ti break anything?
Thought for 5s
Thought for 5s
I'll review the implementation carefully. Let me first check how
RateLimitException
is used elsewhere and look at the test files and
PaginationState
.
Bash
Find all usages of RateLimitException outside the changed files
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/app --include="*.php" | grep -v "HandleHubspotRateLimit\|MatchActivityCrmData\|Client.php\|RateLimitException.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:17:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:68: RateLimitException |
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:15:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:58: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:19:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:76: RateLimitException |
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:50: * @throws RateLimitException When rate limit is hit
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:195: // RateLimitException and other exceptions are re-thrown as-is
Read
PaginationState.php
PaginationState.php
Read
HandleHubspotRateLimitTest.php
HandleHubspotRateLimitTest.php
Bash
Check how RateLimitException is used in GenerateActionItemsJob
IN
grep -rn "RateLimitException\|LogicException\|RuntimeException" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -20
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
Bash
Find all catch blocks or instanceof checks for RateLimitException
IN
grep -rn "catch.*RateLimitException\|instanceof RateLimitException" /Users/lukas/jiminny/app/app --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:11: * Job middleware that catches RateLimitException from HubSpot API calls
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:24: } catch (RateLimitException $e) {
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:149: if (! $e instanceof RateLimitException) {
Bash
Find all test references to RateLimitException
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/tests --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:13:#[CoversClass(RateLimitException::class)]
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:14:class RateLimitExceptionTest extends TestCase
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:18: $exception = new RateLimitException();
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:28: $exception = new RateLimitException('Hubspot rate limit', 30, $previous);
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:52: $exception = new RateLimitException('test', $input);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:10:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:49: public function testPropagatesNonRateLimitExceptions(): void
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:103: throw new RateLimitException('rate limited', $retryAfter);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:150: throw new RateLimitException('rate limited', 1);
Bash
Check retry/failure handling in GenerateActionItemsJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -30
Copy code to clipboard
OUT
13:use Jiminny\Exceptions\RateLimitException;
51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
56: $this->release(30);
Bash
Check retry/failure handling in GenerateAiCallScoringJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php | head -30
Copy code to clipboard
OUT
17:use Jiminny\Exceptions\RateLimitException;
68: RateLimitException |
75: $this->release(30);
Bash
Check retry config in MatchActivityCrmData
IN
grep -n "retryAfter\|RETRY_WINDOW\|retryUntil\|maxTries" /Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php
Copy code to clipboard
OUT
34: private const int RETRY_WINDOW_MINUTES = 30;
45: public function retryUntil(): \DateTimeInterface
47: return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
77: return self::RETRY_WINDOW_MINUTES * 60 + 60;
Bash
Check the cache key format
IN
grep -n "getRateLimitCacheKey\|hubspot:ratelimit" /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php
Copy code to clipboard
OUT
78: $cacheKey = $this->getRateLimitCacheKey();
110: private function getRateLimitCacheKey(): string
112: return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
Bash
Find other jobs that might use the rate limit middleware
IN
grep -rn "class.*Middleware\|HandleHubspotRateLimit" /Users/lukas/jiminny/app/app/Jobs --include="*.php" | grep -v "HandleHubspotRateLimit.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:18:use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:42: return [new HandleHubspotRateLimit()];
Read
HubspotClientInterface.php
HubspotClientInterface.php
Thought for 73s
Thought for 73s...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 22 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"22","depth":22,"bounds":{"left":0.007978723,"top":0.1452514,"width":0.0039893617,"height":0.008778931},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.007978723,"top":0.14604948,"width":0.0023271276,"height":0.007980846}},{"char_start":1,"char_count":1,"bounds":{"left":0.009973404,"top":0.14604948,"width":0.0019946808,"height":0.007980846}}],"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.2601756,"width":0.0019946808,"height":0.008778931},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Testing","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.28731045,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.024933511,"top":0.056664005,"width":0.01662234,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Explorer Section: app","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: app","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.0076462766,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"APP","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.0076462766,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.0933759,"width":0.0063164895,"height":0.003990423},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Handler.php","depth":27,"bounds":{"left":0.03125,"top":0.0933759,"width":0.024601065,"height":0.0023942539},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.09976058,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpBadRequestException.php","depth":27,"bounds":{"left":0.03125,"top":0.101356745,"width":0.061835106,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.10215483,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":26,"bounds":{"left":0.034574468,"top":0.10215483,"width":0.058843084,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.11731844,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpBadRequestWithErrorReasonException.php","depth":27,"bounds":{"left":0.03125,"top":0.118914604,"width":0.08277926,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.11971269,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":41,"bounds":{"left":0.034574468,"top":0.11971269,"width":0.09275266,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.1348763,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpForbiddenException.php","depth":27,"bounds":{"left":0.03125,"top":0.13647246,"width":0.05817819,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.13727055,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.034574468,"top":0.13727055,"width":0.054853722,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.15243416,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpMethodNotAllowedException.php","depth":27,"bounds":{"left":0.03125,"top":0.15403032,"width":0.076130316,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.15482841,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":32,"bounds":{"left":0.034574468,"top":0.15482841,"width":0.07280585,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.16999201,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpNotFoundException.php","depth":27,"bounds":{"left":0.03125,"top":0.17158818,"width":0.057513297,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.17238627,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":24,"bounds":{"left":0.034574468,"top":0.17238627,"width":0.05418883,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.18754987,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpSessionExpiredException.php","depth":27,"bounds":{"left":0.03125,"top":0.18914606,"width":0.068484046,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.18994413,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":30,"bounds":{"left":0.034574468,"top":0.18994413,"width":0.065159574,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.20510775,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpUnauthorizedException.php","depth":27,"bounds":{"left":0.03125,"top":0.20670392,"width":0.06482713,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.207502,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":28,"bounds":{"left":0.034574468,"top":0.207502,"width":0.061502658,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.22266561,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HttpUnsupportedFormatException.php","depth":27,"bounds":{"left":0.03125,"top":0.22426178,"width":0.078457445,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.22505985,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":33,"bounds":{"left":0.034574468,"top":0.22505985,"width":0.07513298,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.24022347,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InvalidArgumentException.php","depth":27,"bounds":{"left":0.03125,"top":0.24181964,"width":0.061502658,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.24261771,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":27,"bounds":{"left":0.032579787,"top":0.24261771,"width":0.06017287,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.25778133,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InvalidDataException.php","depth":27,"bounds":{"left":0.03125,"top":0.25937748,"width":0.05086436,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.2601756,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.032579787,"top":0.2601756,"width":0.049867023,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.2753392,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InvalidEnumException.php","depth":27,"bounds":{"left":0.03125,"top":0.27693537,"width":0.05285904,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.27773345,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.032579787,"top":0.27773345,"width":0.051529255,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.29289705,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InvalidFileException.php","depth":27,"bounds":{"left":0.03125,"top":0.29449323,"width":0.048537236,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.2952913,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.032579787,"top":0.2952913,"width":0.047539894,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.3104549,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InvalidTeamSettingException.php","depth":27,"bounds":{"left":0.03125,"top":0.3120511,"width":0.066821806,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.31284916,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":30,"bounds":{"left":0.032579787,"top":0.31284916,"width":0.06549202,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.32801276,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"JobTimeoutException.php","depth":27,"bounds":{"left":0.03125,"top":0.32960895,"width":0.05219415,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.33040702,"width":0.0023271276,"height":0.011971269}},{"char_start":1,"char_count":22,"bounds":{"left":0.03357713,"top":0.33040702,"width":0.049867023,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.34557062,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"LogicException.php","depth":27,"bounds":{"left":0.03125,"top":0.3471668,"width":0.03956117,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.34796488,"width":0.0023271276,"height":0.011971269}},{"char_start":1,"char_count":17,"bounds":{"left":0.03357713,"top":0.34796488,"width":0.03723404,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.36312848,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MaxTeamTrialSizeExceededException.php","depth":27,"bounds":{"left":0.03125,"top":0.36472467,"width":0.084109046,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.36552274,"width":0.0039893617,"height":0.011971269}},{"char_start":1,"char_count":36,"bounds":{"left":0.03523936,"top":0.36552274,"width":0.080119684,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.38068634,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ModelNotFoundException.php","depth":27,"bounds":{"left":0.03125,"top":0.38228253,"width":0.061170213,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.3830806,"width":0.0039893617,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.03523936,"top":0.3830806,"width":0.05718085,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.3982442,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"NoResultsException.php","depth":27,"bounds":{"left":0.03125,"top":0.39984038,"width":0.04920213,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.40063846,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":21,"bounds":{"left":0.034574468,"top":0.40063846,"width":0.045877658,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.41580206,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"NotImplementedException.php","depth":27,"bounds":{"left":0.03125,"top":0.41739824,"width":0.06216755,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.41819632,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":26,"bounds":{"left":0.034574468,"top":0.41819632,"width":0.059175532,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.43335995,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"NotSupportedException.php","depth":27,"bounds":{"left":0.03125,"top":0.4349561,"width":0.05718085,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.43575418,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":24,"bounds":{"left":0.034574468,"top":0.43575418,"width":0.053856384,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.4509178,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"NumberUnavailableException.php","depth":27,"bounds":{"left":0.03125,"top":0.45251396,"width":0.06815159,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.45331204,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":29,"bounds":{"left":0.034574468,"top":0.45331204,"width":0.06482713,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.46847567,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"OperationException.php","depth":27,"bounds":{"left":0.03125,"top":0.47007182,"width":0.048537236,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.4708699,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":21,"bounds":{"left":0.034574468,"top":0.4708699,"width":0.045545213,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.48603353,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"OutOfBoundsException.php","depth":27,"bounds":{"left":0.03125,"top":0.48762968,"width":0.05618351,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.4884278,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.034574468,"top":0.4884278,"width":0.05285904,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.50359136,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"QuotaExceededException.php","depth":27,"bounds":{"left":0.03125,"top":0.5051876,"width":0.06050532,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.5059856,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.034574468,"top":0.5059856,"width":0.057513297,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.5211492,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException.php","depth":27,"bounds":{"left":0.03125,"top":0.52274543,"width":0.047539894,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.5235435,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":21,"bounds":{"left":0.034242023,"top":0.5235435,"width":0.04488032,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"M","depth":27,"bounds":{"left":0.10638298,"top":0.5235435,"width":0.003656915,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.5387071,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RegistrationInvitationMismatchException.php","depth":27,"bounds":{"left":0.03125,"top":0.5403033,"width":0.08277926,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.54110134,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":42,"bounds":{"left":0.033909574,"top":0.54110134,"width":0.08843085,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.55626494,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RequestQueuedForDeferredExecution.php","depth":27,"bounds":{"left":0.03125,"top":0.55786115,"width":0.08344415,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.5586592,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":36,"bounds":{"left":0.033909574,"top":0.5586592,"width":0.08277926,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.5738228,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ResponseException.php","depth":27,"bounds":{"left":0.03125,"top":0.575419,"width":0.048537236,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.57621706,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":20,"bounds":{"left":0.033909574,"top":0.57621706,"width":0.045877658,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.5913807,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RingCentralException.php","depth":27,"bounds":{"left":0.03125,"top":0.59297687,"width":0.05219415,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.5937749,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.034242023,"top":0.5937749,"width":0.049534574,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.6089386,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RingCentralExtensionNotFound.php","depth":27,"bounds":{"left":0.03125,"top":0.6105347,"width":0.07180851,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.6113328,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":31,"bounds":{"left":0.034242023,"top":0.6113328,"width":0.069148935,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.62649643,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RuntimeException.php","depth":27,"bounds":{"left":0.03125,"top":0.6280926,"width":0.045212764,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.62889063,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":19,"bounds":{"left":0.034242023,"top":0.62889063,"width":0.04255319,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.6440543,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SequenceNumberException.php","depth":27,"bounds":{"left":0.03125,"top":0.64565045,"width":0.06482713,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.64644855,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":26,"bounds":{"left":0.033909574,"top":0.64644855,"width":0.06216755,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.66161215,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ServiceIntegrationException.php","depth":27,"bounds":{"left":0.03125,"top":0.6632083,"width":0.06549202,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.6640064,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":30,"bounds":{"left":0.033909574,"top":0.6640064,"width":0.062832445,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.67917,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ServiceUnavailableException.php","depth":27,"bounds":{"left":0.03125,"top":0.68076617,"width":0.066821806,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.6815643,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":30,"bounds":{"left":0.033909574,"top":0.6815643,"width":0.06416223,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.6967279,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SidekickSettingsException.php","depth":27,"bounds":{"left":0.03125,"top":0.698324,"width":0.06216755,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.69912213,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":28,"bounds":{"left":0.033909574,"top":0.69912213,"width":0.059840426,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.71428573,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SocialAccountNotFoundException.php","depth":27,"bounds":{"left":0.03125,"top":0.7158819,"width":0.0774601,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.7318436,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SocialAccountTokenInvalidException.php","depth":27,"bounds":{"left":0.03125,"top":0.73343974,"width":0.08211436,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.74940145,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncActivityException.php","depth":27,"bounds":{"left":0.03125,"top":0.7509976,"width":0.053523935,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.7669593,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"TenantIsolationException.php","depth":27,"bounds":{"left":0.03125,"top":0.76855546,"width":0.059175532,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.78451717,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"TextRelayException.php","depth":27,"bounds":{"left":0.03125,"top":0.7861133,"width":0.047872342,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.802075,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"TooManyFailedActivities.php","depth":27,"bounds":{"left":0.03125,"top":0.8036712,"width":0.057513297,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.8196329,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"TranscriptionNotIndexedException.php","depth":27,"bounds":{"left":0.03125,"top":0.82122904,"width":0.078125,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.83719075,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UnexpectedCallException.php","depth":27,"bounds":{"left":0.03125,"top":0.8387869,"width":0.06050532,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.8547486,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UnexpectedEloquentModelException.php","depth":27,"bounds":{"left":0.03125,"top":0.85634476,"width":0.0831117,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.87230647,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UnexpectedValueException.php","depth":27,"bounds":{"left":0.03125,"top":0.8739026,"width":0.06416223,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.023936171,"top":0.8898643,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ZipAttackException.php","depth":27,"bounds":{"left":0.03125,"top":0.8914605,"width":0.047872342,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.90901834,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg","depth":27,"bounds":{"left":0.028590426,"top":0.90901834,"width":0.016289894,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.9265762,"width":0.005319149,"height":0.0031923384},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Formats","depth":27,"bounds":{"left":0.028590426,"top":0.9265762,"width":0.01662234,"height":0.0031923384},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.11332801,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Exceptions","depth":27,"bounds":{"left":0.028590426,"top":0.11332801,"width":0.021941489,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.0076462766,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.096568234,"width":0.004654255,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.92976856,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9321628,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.92976856,"width":0.01662234,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.933759,"width":0.01662234,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01761968,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01761968,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"MySQL Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"MYSQL","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.013297873,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"MYSQL","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.013297873,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"MatchActivityCrmData.php, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.07978723,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"RateLimitException.php, Editor Group 1","depth":28,"bounds":{"left":0.19547872,"top":0.047885075,"width":0.0731383,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"HandleHubspotRateLimit.php, Editor Group 1","depth":28,"bounds":{"left":0.2682846,"top":0.047885075,"width":0.08510638,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Client.php, Editor Group 1","depth":28,"bounds":{"left":0.35339096,"top":0.047885075,"width":0.05086436,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"HubspotPaginationService.php, Editor Group 1","depth":28,"bounds":{"left":0.40425533,"top":0.047885075,"width":0.087765954,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.12832446,"top":0.07821229,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.15558511,"top":0.07821229,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.21609043,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.22140957,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Exceptions;\n\nuse Throwable;\n\nclass RateLimitException extends RuntimeException\n{\n public function __construct(\n string $message = '',\n private readonly int $retryAfter = 1,\n ?Throwable $previous = null,\n ) {\n parent::__construct($message, 0, $previous);\n }\n\n public function getRetryAfter(): int\n {\n return max($this->retryAfter, 1);\n }\n}","depth":28,"bounds":{"left":0.13763298,"top":0.22027135,"width":0.125,"height":0.014365523},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Exceptions;\n\nuse Throwable;\n\nclass RateLimitException extends RuntimeException\n{\n public function __construct(\n string $message = '',\n private readonly int $retryAfter = 1,\n ?Throwable $previous = null,\n ) {\n parent::__construct($message, 0, $previous);\n }\n\n public function getRetryAfter(): int\n {\n return max($this->retryAfter, 1);\n }\n}","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Exceptions;\n\nuse Throwable;\n\nclass RateLimitException extends RuntimeException\n{\n public function __construct(\n string $message = '',\n private readonly int $retryAfter = 1,\n ?Throwable $previous = null,\n ) {\n parent::__construct($message, 0, $previous);\n }\n\n public function getRetryAfter(): int\n {\n return max($this->retryAfter, 1);\n }\n}","depth":29,"bounds":{"left":0.13763298,"top":0.22027135,"width":0.125,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Review rate limit handli…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.07014628,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXButton","text":"remote","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"app (Git) - JY-20725-handle-HS-search-rate-limit*+, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.012965426,"top":0.98244214,"width":0.087101065,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.013962766,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"JY-20725-handle-HS-search-rate-limit*+","depth":17,"bounds":{"left":0.019281914,"top":0.9856345,"width":0.07978723,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"app (Git) - Publish Branch","depth":16,"bounds":{"left":0.10006649,"top":0.98244214,"width":0.00731383,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Errors: 6, Warnings: 9, Infos: 2","depth":16,"bounds":{"left":0.1100399,"top":0.98244214,"width":0.032579787,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.11170213,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":17,"bounds":{"left":0.11702128,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.12167553,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":17,"bounds":{"left":0.12699468,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.13164894,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":17,"bounds":{"left":0.13696809,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"key, PHP extension: Premium features not active.","depth":16,"bounds":{"left":0.9790558,"top":0.98244214,"width":0.008643617,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sign In","depth":16,"bounds":{"left":0.9544548,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.95611703,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sign In","depth":17,"bounds":{"left":0.96143615,"top":0.9856345,"width":0.013962766,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Info: You have Docker installed on your system. Do you want to install the recommended extensions from Microsoft for it?","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Clear","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Review rate limit handling for HubSpot job queue","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RateLimitException.php#9-9","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"RateLimitException.php#9-9","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Reveiw the diff. Mostly","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Jobs/Crm/MatchActivityCrmData.php","depth":26,"on_screen":false,"help_text":"Open app/Jobs/Crm/MatchActivityCrmData.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Exceptions/RateLimitException.php","depth":26,"on_screen":false,"help_text":"Open app/Exceptions/RateLimitException.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Jobs/Middleware/HandleHubspotRateLimit.php","depth":26,"on_screen":false,"help_text":"Open app/Jobs/Middleware/HandleHubspotRateLimit.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Services/Crm/Hubspot/Client.php","depth":26,"on_screen":false,"help_text":"Open app/Services/Crm/Hubspot/Client.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"and","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php","depth":26,"on_screen":false,"help_text":"Open app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":". The issue is I am trying to make sure that instant spike of MatchActivityCrmData jobs willl handle 429 exceptions from hubspot. Revewi ti carefully and try to see potential issues and bottlenecks. Also RateLimitException was changerd from LogicException to RuntimeException. Is it ok. This exception is used by other paerts of code. Will ti break anything?","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thought for 5s","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thought for 5s","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"I'll review the implementation carefully. Let me first check how","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is used elsewhere and look at the test files and","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PaginationState","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find all usages of RateLimitException outside the changed files","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"RateLimitException\" /Users/lukas/jiminny/app/app --include=\"*.php\" | grep -v \"HandleHubspotRateLimit\\|MatchActivityCrmData\\|Client.php\\|RateLimitException.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception\n/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:17:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:68: RateLimitException |\n/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:15:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:58: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception\n/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:19:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:76: RateLimitException |\n/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:8:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:50: * @throws RateLimitException When rate limit is hit\n/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:195: // RateLimitException and other exceptions are re-thrown as-is","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaginationState.php","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaginationState.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"HandleHubspotRateLimitTest.php","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"HandleHubspotRateLimitTest.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check how RateLimitException is used in GenerateActionItemsJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"RateLimitException\\|LogicException\\|RuntimeException\" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -20","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find all catch blocks or instanceof checks for RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"catch.*RateLimitException\\|instanceof RateLimitException\" /Users/lukas/jiminny/app/app --include=\"*.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:11: * Job middleware that catches RateLimitException from HubSpot API calls\n/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:24: } catch (RateLimitException $e) {\n/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:149: if (! $e instanceof RateLimitException) {","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find all test references to RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"RateLimitException\" /Users/lukas/jiminny/app/tests --include=\"*.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:8:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:13:#[CoversClass(RateLimitException::class)]\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:14:class RateLimitExceptionTest extends TestCase\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:18: $exception = new RateLimitException();\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:28: $exception = new RateLimitException('Hubspot rate limit', 30, $previous);\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:52: $exception = new RateLimitException('test', $input);\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:10:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:49: public function testPropagatesNonRateLimitExceptions(): void\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:103: throw new RateLimitException('rate limited', $retryAfter);\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:150: throw new RateLimitException('rate limited', 1);","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check retry/failure handling in GenerateActionItemsJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"RateLimitException\\|retryUntil\\|backoff\\|maxExceptions\\|maxTries\\|release\\|failed\" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -30","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"13:use Jiminny\\Exceptions\\RateLimitException;\n51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception\n56: $this->release(30);","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check retry/failure handling in GenerateAiCallScoringJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"RateLimitException\\|retryUntil\\|backoff\\|maxExceptions\\|maxTries\\|release\\|failed\" /Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php | head -30","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"17:use Jiminny\\Exceptions\\RateLimitException;\n68: RateLimitException |\n75: $this->release(30);","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check retry config in MatchActivityCrmData","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"retryAfter\\|RETRY_WINDOW\\|retryUntil\\|maxTries\" /Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"34: private const int RETRY_WINDOW_MINUTES = 30;\n45: public function retryUntil(): \\DateTimeInterface\n47: return now()->addMinutes(self::RETRY_WINDOW_MINUTES);\n77: return self::RETRY_WINDOW_MINUTES * 60 + 60;","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check the cache key format","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"getRateLimitCacheKey\\|hubspot:ratelimit\" /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"78: $cacheKey = $this->getRateLimitCacheKey();\n110: private function getRateLimitCacheKey(): string\n112: return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find other jobs that might use the rate limit middleware","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"class.*Middleware\\|HandleHubspotRateLimit\" /Users/lukas/jiminny/app/app/Jobs --include=\"*.php\" | grep -v \"HandleHubspotRateLimit.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:18:use Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\n/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:42: return [new HandleHubspotRateLimit()];","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"HubspotClientInterface.php","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"HubspotClientInterface.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thought for 73s","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thought for 73s","depth":24,"on_screen":false,"role_description":"text"}]...
|
6152615931188221880
|
-8182911585575468990
|
visual_change
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 22 pending changes
22
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Testing
Claude Code
EXPLORER
EXPLORER
Explorer Section: app
Explorer Section: app
APP
Handler.php
HttpBadRequestException.php
HttpBadRequestWithErrorReasonException.php
HttpForbiddenException.php
HttpMethodNotAllowedException.php
HttpNotFoundException.php
HttpSessionExpiredException.php
HttpUnauthorizedException.php
HttpUnsupportedFormatException.php
InvalidArgumentException.php
InvalidDataException.php
InvalidEnumException.php
InvalidFileException.php
InvalidTeamSettingException.php
JobTimeoutException.php
LogicException.php
MaxTeamTrialSizeExceededException.php
ModelNotFoundException.php
NoResultsException.php
NotImplementedException.php
NotSupportedException.php
NumberUnavailableException.php
OperationException.php
OutOfBoundsException.php
QuotaExceededException.php
RateLimitException.php
M
RegistrationInvitationMismatchException.php
RequestQueuedForDeferredExecution.php
ResponseException.php
RingCentralException.php
RingCentralExtensionNotFound.php
RuntimeException.php
SequenceNumberException.php
ServiceIntegrationException.php
ServiceUnavailableException.php
SidekickSettingsException.php
SocialAccountNotFoundException.php
SocialAccountTokenInvalidException.php
SyncActivityException.php
TenantIsolationException.php
TextRelayException.php
TooManyFailedActivities.php
TranscriptionNotIndexedException.php
UnexpectedCallException.php
UnexpectedEloquentModelException.php
UnexpectedValueException.php
ZipAttackException.php
FFMpeg
Formats
Exceptions
app
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
MySQL Section
MYSQL
MYSQL
MatchActivityCrmData.php, Editor Group 1
RateLimitException.php, Editor Group 1
HandleHubspotRateLimit.php, Editor Group 1
Client.php, Editor Group 1
HubspotPaginationService.php, Editor Group 1
<?php
declare(strict_types=1);
namespace Jiminny\Exceptions;
use Throwable;
class RateLimitException extends RuntimeException
{
public function __construct(
string $message = '',
private readonly int $retryAfter = 1,
?Throwable $previous = null,
) {
parent::__construct($message, 0, $previous);
}
public function getRetryAfter(): int
{
return max($this->retryAfter, 1);
}
}
<?php
declare(strict_types=1);
namespace Jiminny\Exceptions;
use Throwable;
class RateLimitException extends RuntimeException
{
public function __construct(
string $message = '',
private readonly int $retryAfter = 1,
?Throwable $previous = null,
) {
parent::__construct($message, 0, $previous);
}
public function getRetryAfter(): int
{
return max($this->retryAfter, 1);
}
}
Review rate limit handli…, Editor Group 2
remote
app (Git) - JY-20725-handle-HS-search-rate-limit*+, Checkout Branch/Tag...
JY-20725-handle-HS-search-rate-limit*+
app (Git) - Publish Branch
Errors: 6, Warnings: 9, Infos: 2
6
9
2
Notifications
key, PHP extension: Premium features not active.
Sign In
Sign In
Info: You have Docker installed on your system. Do you want to install the recommended extensions from Microsoft for it?
Clear
Review rate limit handling for HubSpot job queue
Session history
New session
Message actions
RateLimitException.php#9-9
RateLimitException.php#9-9
Reveiw the diff. Mostly
@app/Jobs/Crm/MatchActivityCrmData.php
,
@app/Exceptions/RateLimitException.php
,
@app/Jobs/Middleware/HandleHubspotRateLimit.php
,
@app/Services/Crm/Hubspot/Client.php
and
@app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php
. The issue is I am trying to make sure that instant spike of MatchActivityCrmData jobs willl handle 429 exceptions from hubspot. Revewi ti carefully and try to see potential issues and bottlenecks. Also RateLimitException was changerd from LogicException to RuntimeException. Is it ok. This exception is used by other paerts of code. Will ti break anything?
Thought for 5s
Thought for 5s
I'll review the implementation carefully. Let me first check how
RateLimitException
is used elsewhere and look at the test files and
PaginationState
.
Bash
Find all usages of RateLimitException outside the changed files
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/app --include="*.php" | grep -v "HandleHubspotRateLimit\|MatchActivityCrmData\|Client.php\|RateLimitException.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:17:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:68: RateLimitException |
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:15:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:58: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:19:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:76: RateLimitException |
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:50: * @throws RateLimitException When rate limit is hit
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:195: // RateLimitException and other exceptions are re-thrown as-is
Read
PaginationState.php
PaginationState.php
Read
HandleHubspotRateLimitTest.php
HandleHubspotRateLimitTest.php
Bash
Check how RateLimitException is used in GenerateActionItemsJob
IN
grep -rn "RateLimitException\|LogicException\|RuntimeException" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -20
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
Bash
Find all catch blocks or instanceof checks for RateLimitException
IN
grep -rn "catch.*RateLimitException\|instanceof RateLimitException" /Users/lukas/jiminny/app/app --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:11: * Job middleware that catches RateLimitException from HubSpot API calls
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:24: } catch (RateLimitException $e) {
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:149: if (! $e instanceof RateLimitException) {
Bash
Find all test references to RateLimitException
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/tests --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:13:#[CoversClass(RateLimitException::class)]
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:14:class RateLimitExceptionTest extends TestCase
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:18: $exception = new RateLimitException();
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:28: $exception = new RateLimitException('Hubspot rate limit', 30, $previous);
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:52: $exception = new RateLimitException('test', $input);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:10:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:49: public function testPropagatesNonRateLimitExceptions(): void
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:103: throw new RateLimitException('rate limited', $retryAfter);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:150: throw new RateLimitException('rate limited', 1);
Bash
Check retry/failure handling in GenerateActionItemsJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -30
Copy code to clipboard
OUT
13:use Jiminny\Exceptions\RateLimitException;
51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
56: $this->release(30);
Bash
Check retry/failure handling in GenerateAiCallScoringJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php | head -30
Copy code to clipboard
OUT
17:use Jiminny\Exceptions\RateLimitException;
68: RateLimitException |
75: $this->release(30);
Bash
Check retry config in MatchActivityCrmData
IN
grep -n "retryAfter\|RETRY_WINDOW\|retryUntil\|maxTries" /Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php
Copy code to clipboard
OUT
34: private const int RETRY_WINDOW_MINUTES = 30;
45: public function retryUntil(): \DateTimeInterface
47: return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
77: return self::RETRY_WINDOW_MINUTES * 60 + 60;
Bash
Check the cache key format
IN
grep -n "getRateLimitCacheKey\|hubspot:ratelimit" /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php
Copy code to clipboard
OUT
78: $cacheKey = $this->getRateLimitCacheKey();
110: private function getRateLimitCacheKey(): string
112: return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
Bash
Find other jobs that might use the rate limit middleware
IN
grep -rn "class.*Middleware\|HandleHubspotRateLimit" /Users/lukas/jiminny/app/app/Jobs --include="*.php" | grep -v "HandleHubspotRateLimit.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:18:use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:42: return [new HandleHubspotRateLimit()];
Read
HubspotClientInterface.php
HubspotClientInterface.php
Thought for 73s
Thought for 73s...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
19288
|
827
|
41
|
2026-05-11T12:41:05.742266+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778503265742_m2.jpg...
|
Firefox
|
Comparing master...JY-20725-handle-HS-search-rate- Comparing master...JY-20725-handle-HS-search-rate-limit · jiminny/app — Work...
|
True
|
github.com/jiminny/app/compare/JY-20725-handle-HS- github.com/jiminny/app/compare/JY-20725-handle-HS-search-rate-limit?expand=1...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS]
Add a title
*
JY-20725 add HS rate limit handling on activities rematching
Generate pull request title with Copilot
Add a description
Add a description
Comment
Write
Write
Preview
Preview
### JIRA: JY-20725
#### Changes:
- Adds HandleHubspotRateLimit middleware
- Add
Markdown is supported...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.3570479,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.37034574,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"bounds":{"left":0.3570479,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"bounds":{"left":0.37034574,"top":0.09577015,"width":0.16888298,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"bounds":{"left":0.3570479,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"bounds":{"left":0.37034574,"top":0.12849163,"width":0.16140293,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":4,"bounds":{"left":0.3570479,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":5,"bounds":{"left":0.37034574,"top":0.16121309,"width":0.4644282,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Comparing master...JY-20725-handle-HS-search-rate-limit · jiminny/app","depth":4,"bounds":{"left":0.3570479,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Comparing master...JY-20725-handle-HS-search-rate-limit · jiminny/app","depth":5,"bounds":{"left":0.37034574,"top":0.19393456,"width":0.1263298,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.42436835,"top":0.18994413,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.35987368,"top":0.21707901,"width":0.07413564,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.35987368,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.37084442,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.38198137,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.39311835,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.40425533,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"on_screen":false,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"on_screen":false,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"All issues(g then i)","depth":9,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"All pull requests","depth":9,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"All repositories","depth":9,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (33)","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"33","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (4)","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Comparing changes","depth":9,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comparing changes","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"compare across forks","depth":10,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"or","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"learn more about diff comparisons","depth":10,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"learn more about diff comparisons","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"base: master","depth":11,"on_screen":false,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"base:","depth":13,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"master","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"...","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"compare: JY-20725-handle-HS-search-rate-limit","depth":11,"on_screen":false,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"compare:","depth":13,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY-20725-handle-HS-search-rate-limit","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Able to merge.","depth":11,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"These branches can be automatically merged.","depth":10,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@LakyLak","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add a title","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"*","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"JY-20725 add HS rate limit handling on activities rematching","depth":15,"on_screen":false,"value":"JY-20725 add HS rate limit handling on activities rematching","help_text":"","placeholder":"Title","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Generate pull request title with Copilot","depth":16,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Add a description","depth":12,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add a description","depth":13,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Comment","depth":12,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Write","depth":13,"on_screen":false,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Write","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Preview","depth":13,"on_screen":false,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Preview","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextArea","text":"### JIRA: JY-20725\n\n#### Changes:\n\n- Adds HandleHubspotRateLimit middleware\n- Add","depth":15,"on_screen":false,"value":"### JIRA: JY-20725\n\n#### Changes:\n\n- Adds HandleHubspotRateLimit middleware\n- Add","placeholder":" ","role_description":"text entry area","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Markdown is supported","depth":14,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
4470230495086079408
|
5937221299371414158
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
SevenShores\Hubspot\Exceptions\BadRequest: Client error: `POST [URL_WITH_CREDENTIALS]
Add a title
*
JY-20725 add HS rate limit handling on activities rematching
Generate pull request title with Copilot
Add a description
Add a description
Comment
Write
Write
Preview
Preview
### JIRA: JY-20725
#### Changes:
- Adds HandleHubspotRateLimit middleware
- Add
Markdown is supported...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
19360
|
829
|
41
|
2026-05-11T12:43:56.106135+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778503436106_m2.jpg...
|
Firefox
|
JY-20725 add HS rate limit handling on activities JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/12066
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
SevenShores\Hubspot\Exceptions\BadRequest: 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
SevenShores\Hubspot\Exceptions\BadRequest: 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
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.3570479,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.37034574,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"bounds":{"left":0.3570479,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"bounds":{"left":0.37034574,"top":0.09577015,"width":0.16888298,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"bounds":{"left":0.3570479,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"bounds":{"left":0.37034574,"top":0.12849163,"width":0.16140293,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":4,"bounds":{"left":0.3570479,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":5,"bounds":{"left":0.37034574,"top":0.16121309,"width":0.4644282,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"bounds":{"left":0.3570479,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"bounds":{"left":0.37034574,"top":0.19393456,"width":0.18816489,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.42436835,"top":0.18994413,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.35987368,"top":0.21707901,"width":0.07413564,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.35987368,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.37084442,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.38198137,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.39311835,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.40425533,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":7,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":8,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":11,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":10,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":13,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":13,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
7365371297458858444
|
-3200622467140234622
|
visual_change
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
SevenShores\Hubspot\Exceptions\BadRequest: 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
SevenShores\Hubspot\Exceptions\BadRequest: 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
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app...
|
19359
|
NULL
|
NULL
|
NULL
|
|
19824
|
849
|
41
|
2026-05-11T13:37:37.247642+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778506657247_m2.jpg...
|
Firefox
|
Coverage on New Code - app in Jiminny SonarQube Cl Coverage on New Code - app in Jiminny SonarQube Cloud — Work...
|
True
|
sonarcloud.io/login?return_to=%2Fcomponent_measure sonarcloud.io/login?return_to=%2Fcomponent_measures%3Fid%3Djiminny_app%26pullRequest%3D12066%26metric%3Dnew_coverage%26view%3Dlist...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
SevenShores\Hubspot\Exceptions\BadRequest: 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
SevenShores\Hubspot\Exceptions\BadRequest: 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
Coverage on New Code - app in Jiminny SonarQube Cloud
Coverage on New Code - app in Jiminny SonarQube Cloud
Close tab
Pipelines - jiminny/app
Pipelines - jiminny/app
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to main content
Skip to main content
Skip to measure filters
Skip to measure filters...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.3570479,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.37034574,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"bounds":{"left":0.3570479,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"bounds":{"left":0.37034574,"top":0.09577015,"width":0.16888298,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"bounds":{"left":0.3570479,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"bounds":{"left":0.37034574,"top":0.12849163,"width":0.16140293,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":4,"bounds":{"left":0.3570479,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":5,"bounds":{"left":0.37034574,"top":0.16121309,"width":0.4644282,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Coverage on New Code - app in Jiminny SonarQube Cloud","depth":4,"bounds":{"left":0.3570479,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Coverage on New Code - app in Jiminny SonarQube Cloud","depth":5,"bounds":{"left":0.37034574,"top":0.19393456,"width":0.10139628,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.42436835,"top":0.18994413,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.3570479,"top":0.21548285,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.37034574,"top":0.22665602,"width":0.039228722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.35987368,"top":0.24980047,"width":0.07413564,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.35987368,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.37084442,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.38198137,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.39311835,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.40425533,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to main content","depth":7,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to main content","depth":8,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Skip to measure filters","depth":7,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to measure filters","depth":8,"on_screen":false}]...
|
-600017987237558078
|
-2930648659048361334
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
SevenShores\Hubspot\Exceptions\BadRequest: 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
SevenShores\Hubspot\Exceptions\BadRequest: 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
Coverage on New Code - app in Jiminny SonarQube Cloud
Coverage on New Code - app in Jiminny SonarQube Cloud
Close tab
Pipelines - jiminny/app
Pipelines - jiminny/app
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to main content
Skip to main content
Skip to measure filters
Skip to measure filters...
|
19822
|
NULL
|
NULL
|
NULL
|
|
19995
|
859
|
41
|
2026-05-11T14:16:04.592366+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778508964592_m2.jpg...
|
Code
|
Review rate limit handli… — app
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G)","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"}]...
|
-6694492522712654531
|
-1553582291075194862
|
visual_change
|
hybrid
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G)
Client.php 9 xV APP" services• Hubspol~OpportunitySynestrategy.• HubsnotLastModified@nenSvncStra..# HubspotLastModifiedSyncStrategy....# HubsootSinaleSyncstrategy.onp## HubspotSyncStrategyBase.php• HubsnotWebhookBatchSyncstrateg.Wwlallawwaa# HubspotPaginationService.php# PaginationConfig.php# PaginationState.phpProspectsearchstrategy~ Servicelraits# OpportunitySyncTrait.php• SvncCrmEntitiesTrait.phpwsuncrields.rait.ono• WriteCrmTrait.phr• Utils• WebhookBatchSvncCollector.ohoBatchSvncRedisService.ohvClient.oho* ClosedDealStagesService.oho* DealFieldsService.oho* DecorateActivitv.oho• FieldDefinitions.ohn|• FieldTvoeConverter.ohn# HubspotClientinterface.php# HubspotTokenManager.phpR PayloadBuilder.php€ PemoteCrmObiectManinulator.nhn«* PecnonceNormalize nhn• Service.php# SyncFieldAction.php# SyncRelatedActivityManager.php# WebhookSyncBatchProcessor.php> IntearationApp• Listeners> Metadata• MiarationV Pipedrive• OpportunitySvncStrateavProspectSearchStrateavOUTIINETIMELINGi8 JY-20725-handle-HS-search-rate-limit* ©app > Services > Crm › Hubspot › f* Client.php › °g Client › parseRetryAfter ()class Client extends Baseclient 1mpLements Hubspotclientintertace123pub lic tunction 1sHubspotRateL1m1t Throwable Se : bool137pubd L1c• tunction-parseretryArter(Tnrowable se): •1nc1t• method exists se,'getResponseMeaders"))•‹Sheaders =Se->aetResoonseHeaderso-?:-0*$value = $headers ('Retry-After')•?? Sheaders['retry-after')•?? null;$value = $value [0] •22-null;if. (1s numeric(svatue)). +Smessage = strtolower($e->getMessage));it• (sur contains(smessage, ' dally y)'1if• (str_contains(Smessage,'ten secondly")) •1• return - 10:if• (str_contains($message, 'secondly')) -{return-1;Sthis->loq->warning(* (Hubspot)•No retry-after header or known message, using default'.-[get_class($e),message" .= Smessage.return.10.public function getMinimumApiVersion(): stringreturn celf.-MtN ApT VERSTON•public function getInstance(): Factorynew ractoryl= Sthis→>accesstoken,'oauth?"base url => sthis->baseUruoublic function aetNewinstance: Discovervreturn HubSpot\Factorv::createWithAccessToken/Sthis-saccessToken@6A9026• 2 C→ Review rate limit handli... XReview rate limit handling for HubSpot jo..<› Client.nhn#62-169Add coverage of new methods in Client public function search(string $objectType, array Spayload): array< 40 hl100% Lz• Mon 11 May 17:16:0408000*0&.• Read Response.php (lines 101-130)• Thouaht for Os ›•Bach Sind aetDataFromPesnonse in HubsnotResnonsearep -n "aetDataFromResoponse" /Users/lukas/iiminny/aop/vendor/hubspot/hubspot-oho/src/Htto/Response.ohoOUT 25private function getDataFromReseInterface Gresnonse'• Read Response.oho (lines 380-399)• Bash Check PHPUnit bootstrap contigurationgrep -n "bootstrap\|bootstrap" /Users/lukas/jiminny/app/phpunit.xml 2>/dev/null | head -5 || cat /Users/lukas/jiminny/app/phpunit.xml | head -20AKohOun tXM INSHXST EATETOR IMNMAWAHO EOT20OVAXMIS ChEMASInSiTanCelXST laNo NamesOAces ChemalLo cataIon=lhTatOSA ls Chema-ohoun EaderAeASYhoun taXcdl hoo tsi tranE"vendor auto oadHoholcol loEsET• Thouaht for 3s ;• Good — the bootstran is iust Comooser's autoloader. no Laravel bootstrannina. Now let's run the new tests;• Bash Run the new ClientTest methodsIN php vendor/bin/phpunit tests/Unit/Services/Crm/Hubspot/ClientTest.php -filter="testSearch|testIsHubspotRateLimit|testParseRetryAfter" --n0-coverage 2>&1 | tail -50Run the new ClientTest methods1 ves7 Yes, alllow oho vendorlbin/oh.... for alll oroiects3 NoTell Claude what to do insteadEsc to cancel8 SignIn...
|
19993
|
NULL
|
NULL
|
NULL
|
|
20250
|
871
|
41
|
2026-05-11T14:48:55.398298+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778510935398_m2.jpg...
|
Code
|
Client.php (Working Tree) (Client.php) — app — 9 p Client.php (Working Tree) (Client.php) — app — 9 problems in this file • Modified...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 17 pending changes
17
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Testing
Claude Code
SOURCE CONTROL
SOURCE CONTROL
Changes Section
CHANGES
CHANGES
Commit Changes on "JY-20725-handle-HS-search-rate-limit"
Commit
More Actions...
Changes
17
.env.local
M
.env.nikilocal
U
.env.other
U
ids.txt
U
raw_sql_query.sql
U
WEBHOOK_FILTERING_IMPLEMENTATION.md
U...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 17 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":22,"bounds":{"left":0.00831117,"top":0.1452514,"width":0.003656915,"height":0.008778931},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.008643617,"top":0.14604948,"width":0.0016622341,"height":0.007980846}},{"char_start":1,"char_count":1,"bounds":{"left":0.009973404,"top":0.14604948,"width":0.0019946808,"height":0.007980846}}],"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.2601756,"width":0.0019946808,"height":0.008778931},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Testing","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.28731045,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"SOURCE CONTROL","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.034242023,"height":0.02793296},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"SOURCE CONTROL","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.034242023,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Changes Section","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"CHANGES","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.01861702,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"CHANGES","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.01861702,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"","depth":28,"bounds":{"left":0.024601065,"top":0.09896249,"width":0.07247341,"height":0.015961692},"on_screen":true,"value":"","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Commit Changes on \"JY-20725-handle-HS-search-rate-limit\"","depth":26,"bounds":{"left":0.022273935,"top":0.1245012,"width":0.08045213,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.052526597,"top":0.12849163,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Commit","depth":27,"bounds":{"left":0.058843084,"top":0.1292897,"width":0.014960106,"height":0.011173184},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.059175532,"top":0.1292897,"width":0.0029920214,"height":0.011173184}},{"char_start":1,"char_count":5,"bounds":{"left":0.061835106,"top":0.1292897,"width":0.011968086,"height":0.011173184}}],"role_description":"text"},{"role":"AXPopUpButton","text":"More Actions...","depth":26,"bounds":{"left":0.10305851,"top":0.1245012,"width":0.00831117,"height":0.0207502},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.1043883,"top":0.12849163,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.019614361,"top":0.15163608,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Changes","depth":27,"bounds":{"left":0.025930852,"top":0.15163608,"width":0.01761968,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.025930852,"top":0.15243416,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":6,"bounds":{"left":0.028922873,"top":0.15243416,"width":0.014960106,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"17","depth":27,"bounds":{"left":0.10571808,"top":0.15243416,"width":0.0039893617,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.10605053,"top":0.15243416,"width":0.0016622341,"height":0.0103751}},{"char_start":1,"char_count":1,"bounds":{"left":0.10771277,"top":0.15243416,"width":0.0019946808,"height":0.0103751}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.021276595,"top":0.16759777,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env.local","depth":28,"bounds":{"left":0.028590426,"top":0.16919394,"width":0.01861702,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.16999201,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":9,"bounds":{"left":0.029920213,"top":0.16999201,"width":0.01761968,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"M","depth":28,"bounds":{"left":0.106715426,"top":0.16999201,"width":0.003656915,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.021276595,"top":0.18515563,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env.nikilocal","depth":28,"bounds":{"left":0.028590426,"top":0.1867518,"width":0.025598405,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.18754987,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":13,"bounds":{"left":0.029920213,"top":0.18754987,"width":0.024268618,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"U","depth":28,"bounds":{"left":0.107380316,"top":0.18754987,"width":0.0029920214,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.021276595,"top":0.20271349,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".env.other","depth":28,"bounds":{"left":0.028590426,"top":0.20430966,"width":0.019946808,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.20510775,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":9,"bounds":{"left":0.029920213,"top":0.20510775,"width":0.01861702,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"U","depth":28,"bounds":{"left":0.107380316,"top":0.20510775,"width":0.0029920214,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.021276595,"top":0.22027135,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ids.txt","depth":28,"bounds":{"left":0.028590426,"top":0.22186752,"width":0.012300532,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.22266561,"width":0.0009973404,"height":0.011971269}},{"char_start":1,"char_count":6,"bounds":{"left":0.029587766,"top":0.22266561,"width":0.011635638,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"U","depth":28,"bounds":{"left":0.107380316,"top":0.22266561,"width":0.0029920214,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.021276595,"top":0.23782921,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"raw_sql_query.sql","depth":28,"bounds":{"left":0.028590426,"top":0.23942538,"width":0.035904255,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.24022347,"width":0.0016622341,"height":0.011971269}},{"char_start":1,"char_count":16,"bounds":{"left":0.03025266,"top":0.24022347,"width":0.034242023,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"U","depth":28,"bounds":{"left":0.107380316,"top":0.24022347,"width":0.0029920214,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"bounds":{"left":0.021276595,"top":0.25538707,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"WEBHOOK_FILTERING_IMPLEMENTATION.md","depth":28,"bounds":{"left":0.028590426,"top":0.25698325,"width":0.076130316,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.028590426,"top":0.25778133,"width":0.0043218085,"height":0.011971269}},{"char_start":1,"char_count":34,"bounds":{"left":0.032912236,"top":0.25778133,"width":0.08909574,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"U","depth":28,"bounds":{"left":0.107380316,"top":0.25778133,"width":0.0029920214,"height":0.011173184},"on_screen":true,"role_description":"text"}]...
|
5444134436947423916
|
-37990785732779384
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 17 pending changes
17
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Testing
Claude Code
SOURCE CONTROL
SOURCE CONTROL
Changes Section
CHANGES
CHANGES
Commit Changes on "JY-20725-handle-HS-search-rate-limit"
Commit
More Actions...
Changes
17
.env.local
M
.env.nikilocal
U
.env.other
U
ids.txt
U
raw_sql_query.sql
U
WEBHOOK_FILTERING_IMPLEMENTATION.md
U...
|
NULL
|
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/ /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php...
|
NULL
|
NULL
|
|
20814
|
903
|
41
|
2026-05-11T16:19:25.773208+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778516365773_m2.jpg...
|
Claude
|
Claude
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Skip to content
Skip to content
Click to collapse
Skip to content
Skip to content
Click to collapse
⌘B
Drag to resize
Collapse sidebar
Search
Chat
Cowork
Code
New chat ⌘N
New chat
⌘N
Projects
Artifacts
Customize
Pinned
Bulgarian citizenship application process for EU residents
More options for Bulgarian citizenship application process for EU residents
Dawarich location tracking project
More options for Dawarich location tracking project
Recents
View all
Hubspot BadRequest headers debugging
More options for Hubspot BadRequest headers debugging
Screenpipe sync script failing after recent migrations
More options for Screenpipe sync script failing after recent migrations
Monthly expense tracking
More options for Monthly expense tracking
Exporting transaction data from Notion to finance hub
More options for Exporting transaction data from Notion to finance hub
💬 How much have I spent for groc…
More options for 💬 How much have I spent for groc…
April 2026 spending by category
More options for April 2026 spending by category
Code diff review
More options for Code diff review
HubSpot rate limit implementation strategy
More options for HubSpot rate limit implementation strategy
Screenpipe retention policy code location
More options for Screenpipe retention policy code location
Viewing retention policy in screenpipe
More options for Viewing retention policy in screenpipe
Clean shot x video recording termination issue
More options for Clean shot x video recording termination issue
HubSpot rate limit handling with executeRequest
More options for HubSpot rate limit handling with executeRequest
Untitled
More options
💬 Screen pipe. Is there ability…
More options for 💬 Screen pipe. Is there ability…
SMB mount access inconsistency between Finder and iTerm
More options for SMB mount access inconsistency between Finder and iTerm
💬 What is the best switch I can…
More options for 💬 What is the best switch I can…
Permission denied on screenpipe volume
More options for Permission denied on screenpipe volume
Screenpipe sync database attachment error
More options for Screenpipe sync database attachment error
Last swimming outing with Dani
More options for Last swimming outing with Dani
Definition of incarcerated
More options for Definition of incarcerated
Lukas Pro
Get apps and extensions
Screenpipe sync script failing after recent migrations, rename chat
Screenpipe sync script failing after recent migrations
More options for Screenpipe sync script failing after recent migrations
Open sidebar
Share chat
Claude finished the response
You said: after recent updated in screenpipe (find out what are these) I am unable to run script.
You said: after recent updated in screenpipe (find out what are these) I am unable to run script.
Pasted Text, pasted, 353 lines
#!/bin/bash # screenpipe_sync.sh # Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions). # Also copies the day's video/frame data folder to the NAS. # # Usage: # ./screenpipe_sync.sh # syncs yesterday (default) # ./screenpipe_sync.sh 2026-04-15 # sync
PASTED
after recent updated in screenpipe (find out what are these) I am unable to run script. (pasted) "lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-05-07
[2026-05-10 11:50:45] ========================================
[2026-05-10 11:50:45] Screenpipe sync starting for: 2026-05-07
[2026-05-10 11:50:45] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK (2.2G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists ( 10G)
Data dir: OK (266 files, 292M)
[+00m05s] ▶ Counting source rows for 2026-05-07
frames: 6262
elements: 623002
ui_events: 7412
ocr_text: 1670
meetings: 2
[+00m05s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m06s] ▶ Syncing data for 2026-05-07
video_chunks ✓ 0m01s
frames (6262 rows) ⠋ Parse error near line 3: table nas.frames has 24 columns but 30 values were supplied" There were some recent changes in migrations. Here are migrations form the begining of march (approx after I installed irt first time) 20260301000000 create elements table 2026-05-06 17:27:34 True 736637f38c6e0b5547f23c870ebbc3e87ef2d8d33b22ce73f7 ... 1302167
20260301100000 fts external content 2026-05-06 17:27:34 True 44ca0e5fc3b23c19aa09d7ac3fea48de604032d5feced2615c ... 2102875
20260301200000 drop ui monitoring 2026-05-06 17:27:34 True 9ab8a4d8c0d602b491ef1a6ff36076fd7b7c12c05848201682 ... 620375
20260306000000 delete empty transcriptions 2026-05-06 17:27:34 True 5f991a21d663157a2bce5cb9f0729f02181eef817aaef5a0b8 ... 166792
20260309000000 add cloud blob id 2026-05-06 17:27:34 True e1588e32884ec5660d11bbaa995d767fb2172bb9732ad22319 ... 1450542
20260310000000 create memories 2026-05-06 17:27:34 True 4fd07e878de1dd5b8d184e7bca9ee4e6b2480bbf39e5a68ff7 ... 1135416
20260311000000 drop unused tables 2026-05-06 17:27:34 True 3d9eb9d327a61c4055b31e22082cd045e00bd7a875cbdee86b ... 547625
20260312000000 consolidate search to frames full text 2026-05-06 17:27:34 True 5a7a31a359e9e93978d46ab4759fc8cd43898c0fd325d001b7 ... 3038250
20260312000001 drop dead fts tables 2026-05-06 17:27:34 True dd8264b96b4427f40b06ac60b813b77b6d055b24dd727212c5 ... 297250
20260312000002 drop accessibility tags 2026-05-06 17:27:34 True 672b2661f7e0fc8026f2eb6cc5d24935a15db4ed4982aeb973 ... 260167
20260315000000 add frame id to memories 2026-05-06 17:27:34 True f324ec7981134e647b6497126a2b6a7467e94d271d140d0d25 ... 642250
20260316000000 add elements activity summary index 2026-05-06 17:27:34 True 5b3f99a0d58fc73d62f240319d0718963364fdee1e3a7c4866 ... 265834
20260317000000 add elements automation props 2026-05-06 17:27:34 True 4bd132d263de143c7bb0dcf2e3b8074606c58c0f79e6091d13 ... 537750
20260318000000 add elements ref frame id 2026-05-06 17:27:34 True 33282b2c342e4743f096d1e3093146e243d97f392fe4df2cb5 ... 525250
20260319000000 add sync id indexes 2026-05-06 17:27:34 True 22c7a18c918cfcc458f05fdbfe2a0b2bb65a67ae9daeec6028 ... 407083
20260320000000 add note to meetings 2026-05-06 17:27:34 True cfa45b4c98e300c40cd36942839aa20528f47ae3e7b9c86751 ... 519625
20260324000000 drop ocr text delete trigger 2026-05-06 17:27:34 True 99f445308168fc88f993c43f8e884cc4dc7e41411c86b4d3e7 ... 182209
20260326000000 add session path to pipe executions 2026-05-06 17:27:34 True 5aa266dfcd7b741a18dd3ffb6b0ca3caf2e569959074cbc3ff ... 549583
20260411000000 add elements ref frame id index 2026-05-06 17:27:34 True 378589322920e74980ea48c6b44c916cd488e47a8f6172161e ... 232083
20260415000000 frames fts external content 2026-05-06 17:27:34 True 3fdac70da2fd44bca3c3717768b57c4cbee743451b73f13de9 ... 1259250
20260423000000 add speaker id indexes 2026-05-06 17:27:34 True 80e8e0cf144ee620c81b3796196ca22b8e34f9c152ca2ffe8f ... 398709
20260429000000 add evicted at to chunks 2026-05-06 17:27:34 True 180b1d44305df17620929a69ecce60fa3ce0148905adf19ff7 ... 963833
20260502000000 add elements on screen 2026-05-06 17:27:34 True 2cf51a077a75ef32e4e1d722092053ce919bdeee151d3d91fb ... 644500
20260504120000 add document path column 2026-05-06 17:27:34 True d84f7127e1647984eeb1f89e8dffd0918525f128e4608d323f ... 593042
20260506120000 add memories sync columns 2026-05-07 06:45:22 True 800beaaa228c7fbd88fe367dc5b357adb72a3a0635da5a30f4 ... 1777417
20260501000000 add redacted columns 2026-05-08 06:25:45 True 2a4cd6714a2322ccf8f2af6084af5a05e40f460c44c1aaf874 ... 795120667
20260503000000 add frames image redacted 2026-05-08 06:25:45 True . It worked up to the point where I attemtped to remove it and install again since the retention policy doesn't clear old data and it was to big. I am basically moving data to nas and query it form there. mac is for capture only or lets say one week query using claude code. THe main consumer and interface is on nas. How to make it work so new changes won't messup my setup. Seems like I removed the whole folder it was working find runnign with @letest even I may be wrong.
Show more
10 May
Retry
Edit
Copy
Claude responded: Looking at this carefully, the error tells the whole story:
Claude responded: Looking at this carefully, the error tells the whole story:
Pinpointing schema mismatches from recent PII redaction migrations
Pinpointing schema mismatches from recent PII redaction migrations
Looking at this carefully, the error tells the whole story:
Copy to clipboard
table nas.frames has 24 columns but 30 values were supplied
Your source DB got 6 new columns from recent migrations, but the NAS archive was created earlier with the old schema.
CREATE TABLE IF NOT EXISTS
is a no-op when the table exists, so the NAS schema is frozen at whatever it was when first created. Then
INSERT ... SELECT *
does positional mapping, which blows up the moment column counts diverge.
Let me verify the recent screenpipe changes and then fix this properly.
Diagnosed schema drift, architected resilient migration strategy
Diagnosed schema drift, architected resilient migration strategy
What's happening
What's happening
The error is schema drift, not a screenpipe bug. Your source DB grew 6 columns from these migrations (most landed late April / early May with the PII work):
20260429000000 add evicted at to chunks
→
video_chunks.evicted_at
20260502000000 add elements on screen
→
elements.on_screen
20260504120000 add document path column
→
frames.document_path
20260501000000 add redacted columns
→ redacted columns on frames/ocr_text/elements (this is the big one — accompanies the new
screenpipe/pii-redactor
model)
20260503000000 add frames image redacted
→
frames.image_redacted_path
20260506120000 add memories sync columns
→ memories table
Your NAS
archive.db
was created before these landed.
CREATE TABLE IF NOT EXISTS
is a no-op on existing tables, so the NAS schema froze. Then
INSERT INTO nas.frames SELECT * FROM main.frames
does
positional
mapping → 30 source values into a 24-column NAS table → parse error.
You weren't wrong about
npx screenpipe@latest
working: removing the folder gave you a fresh local DB with the new schema, and querying still works because everything is on one schema. The mismatch only surfaces when you try to merge old + new schemas via the sync.
The fix
The fix
Two changes make this future-proof:
ensure_columns
— before each insert, diff source vs NAS columns and run
ALTER TABLE ADD COLUMN
for any new ones. SQLite handles this as a metadata-only op, so it's instant even on your 10G archive.
Explicit column lists in INSERT
— never
SELECT *
again. Build the column list dynamically from
PRAGMA table_info(<table>)
and use
INSERT INTO t (cols) SELECT cols FROM ...
. Now positional drift is structurally impossible.
Bonus: dropped columns in future migrations will also be handled gracefully — the archive keeps the column with NULLs for new rows, no errors.
Let me write the updated script.
Created a file, ran a command, read a file
Created a file, ran a command, read a file
What changed in the script
What changed in the script
Three additions, everything else preserved:
Schema helpers
(
table_columns_with_types
,
table_columns
,
table_exists
,
ensure_columns
,
build_col_list
) — pure bash + sqlite3 PRAGMA, no extra deps.
New "Reconciling NAS schema with source" step
— runs after
CREATE TABLE IF NOT EXISTS
, before indexes/FTS/inserts. For each table in
SYNC_TABLES
, it diffs source columns against NAS and
ALTER TABLE ADD COLUMN
s the missing ones. Output looks like:
Copy to clipboard
schema: frames ✓ added 4: cloud_blob_id document_path image_redacted_path text_redacted
schema: elements ✓ added 2: on_screen text_redacted
schema: video_chunks ✓ added 1: evicted_at
Explicit column lists in every INSERT
—
FRAMES_COLS=$(build_col_list frames)
builds
"id","timestamp","app_name",...
from source
PRAGMA table_info
, and the inserts use
INSERT INTO nas.t (cols) SELECT cols FROM main.t
. No more positional mapping. Column names are double-quoted so any future hyphens or reserved-word columns won't break parsing.
What to expect on the next run
What to expect on the next run
First run after dropping it in: the "Reconciling NAS schema with source" step will print the missing columns it adds to your existing 10G archive (4 on
frames
, plus a few on
elements
/
video_chunks
/
ocr_text
). Each
ALTER TABLE ADD COLUMN
is a metadata-only op in SQLite — no table rewrite, no VACUUM needed, total cost should be sub-second even on the 10G file. Then 2026-05-07 will sync normally.
After that, when Screenpipe ships the next migration, your sync just picks up the new columns automatically. No more breakage.
One thing worth knowing
One thing worth knowing
If Screenpipe ever
drops
a column in source (rare but possible — they did
drop ui monitoring
and
drop dead fts tables
earlier), the NAS will still have it, and
build_col_list
(sourced from
main
) won't reference it. New rows will have NULL for the orphaned column, old rows keep their data. That's the right archival behavior — but if you ever want to actually drop those orphan columns from NAS, that's a manual
ALTER TABLE ... DROP COLUMN
which SQLite has supported since 3.35 (your macOS Tahoe ships 3.43+, and your NAS Docker SQLite is fine).
View Screenpipe sync
Screenpipe sync
SH
Open Screenpipe sync
Open in iTerm
Copy
Give positive feedback
Give negative feedback
Retry
You said: ok but given the changes introduced is there something I may actually use
You said: ok but given the changes introduced is there something I may actually use
ok but given the changes introduced is there something I may actually use
10 May
Retry
Edit
Copy
Claude responded: Good question.
Claude responded: Good question.
Cataloging PII redactor capabilities and security categories
Cataloging PII redactor capabilities and security categories
Good question. Let me look at what these new columns actually do and which ones map to your setup, since not all of them are equal value for you.
Evaluated four practical database columns for his specific workflow needs
Evaluated four practical database columns for his specific workflow needs
Yeah, three of them are genuinely useful for your setup. The rest are cloud-sync plumbing you can ignore.
frames.document_path — most useful for you
frames.document_path
— most useful for you
Captures the path of the document/file open at frame time. This is a meaningful upgrade over relying on
app_name
+
window_name
for IDE work.
Concrete uses given your stack:
Daily activity summary
: instead of "spent 2h in PhpStorm", you can group by
document_path
and get "spent 2h in
app/Http/Controllers/ReportsController.php
" — directly tied to the JY-20458 work.
Ticket correlation
: branch names contain ticket IDs in PhpStorm window titles, but file paths are cleaner. Query
WHERE document_path LIKE '%/reports/%'
to slice by feature area.
Replaces some of the
LIKE '%JY-%'
fishing
: your hyphenated-token issue with FTS5 mostly comes up in OCR text. For "what was I working on",
document_path
skips OCR entirely.
Worth adding an index on the NAS:
Copy to clipboard
sql
CREATE
INDEX
IF
NOT
EXISTS
idx_frames_document_path
ON
frames
(
document_path
)
WHERE
document_path
IS
NOT
NULL
;
elements.on_screen — directly useful for the meeting detector
elements.on_screen
— directly useful for the meeting detector
This is a boolean for whether the element was actually visible (vs. in the accessibility tree but scrolled off / occluded / behind a collapsed panel).
For your
meeting-detector
pipeline:
Zoom's accessibility tree exposes
everyone
on the call, including names in collapsed roster panels. Adding
WHERE on_screen = 1
cuts the participant detector down to people whose name tile was actually rendered — much closer to "who was visible during this segment".
For daily summaries: weights time-on-element by visibility, so reading vs. having-a-tab-open look different.
Cheap to add, big signal-to-noise win.
PII redaction columns (text_redacted etc.) — useful but with caveats
PII redaction columns (
text_redacted
etc.) — useful but with caveats
The model behind these is
screenpipe/pii-redactor
, fine-tuned for accessibility trees, OCR'd screen text, and computer-use traces. Detects 12 categories including a
secret
class that catches passwords, API keys, JWTs, DB connection strings, and PRIVATE-KEY markers — exactly the stuff that leaks into your captures during Laravel/Salesforce/HubSpot dev work.
For your setup, this maps well because:
The NAS archive is the consumer, queried by Claude Code agentically. Pointing those queries at
text_redacted
rather than
text
reduces the blast radius if a prompt or tool result ends up somewhere unexpected.
Your Mac captures Jiminny customer data on every call. Redacted text is safer for archival queries that don't need exact content (which is most of them).
Caveats worth knowing before flipping it on:
Probably opt-in.
Migrations only added the columns; redaction itself almost certainly needs a flag (worth checking
screenpipe record --help
for something like
--enable-pii-redaction
). Without enabling, the columns just stay NULL.
Over-redacts on short strings
: ~8% on accessibility/window titles, ~16% on long-form. Bulgarian names + Slovak surnames in your genealogy notes will likely trigger false positives. Keep the unredacted
text
column for cases where you need ground truth.
Model license is CC BY-NC 4.0
— non-commercial only, so not suitable for anything Jiminny-business related; fine for personal use.
Practical pattern: query
text_redacted
by default, fall back to
text
only when you explicitly need the raw value.
video_chunks.evicted_at — minor diagnostic value
video_chunks.evicted_at
— minor diagnostic value
When the local retention policy prunes a chunk, this stamps the time. Given your 7-day retention + nightly sync to NAS, you could add a preflight check that warns if a chunk got evicted before its frames were synced (would mean you have frame metadata pointing to deleted video). Realistically your nightly sync at 3am is well inside the 7-day window, so this is more "nice diagnostic" than "must-use".
Skip these
Skip these
frames.cloud_blob_id
,
memories sync columns
— for the optional E2EE cloud sync feature. You self-host, you don't need them. Stays NULL.
If you want, I can draft a small SQL migration for the NAS-side indexes (
document_path
,
on_screen
) and a tweaked version of your daily-activity-summary Claude Code prompt that uses
document_path
for grouping. Both are short.
Copy
Give positive feedback...
|
[{"role":"AXLink","text":& [{"role":"AXLink","text":"Skip to content","depth":14,"bounds":{"left":0.0023271276,"top":0.025538707,"width":0.0003324468,"height":0.0007980846},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Skip to content","depth":15,"bounds":{"left":0.0023271276,"top":0.026336791,"width":0.030917553,"height":0.013567438},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.0023271276,"top":0.027134877,"width":0.0026595744,"height":0.012769354}},{"char_start":1,"char_count":14,"bounds":{"left":0.004986702,"top":0.027134877,"width":0.02825798,"height":0.012769354}}],"role_description":"text"},{"role":"AXStaticText","text":"Click to collapse","depth":16,"bounds":{"left":0.10239362,"top":0.02952913,"width":0.030585106,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.10239362,"top":0.02952913,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":16,"bounds":{"left":0.10538564,"top":0.02952913,"width":0.027925532,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"⌘B","depth":16,"bounds":{"left":0.1349734,"top":0.02952913,"width":0.0063164895,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Drag to resize","depth":16,"bounds":{"left":0.10239362,"top":0.0415004,"width":0.025930852,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.10239362,"top":0.0415004,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":13,"bounds":{"left":0.10538564,"top":0.0415004,"width":0.022938829,"height":0.011971269}}],"role_description":"text"},{"role":"AXButton","text":"Collapse sidebar","depth":15,"bounds":{"left":0.030585106,"top":0.02952913,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search","depth":15,"bounds":{"left":0.03856383,"top":0.02952913,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chat","depth":16,"bounds":{"left":0.005984043,"top":0.06304868,"width":0.026263298,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cowork","depth":16,"bounds":{"left":0.032579787,"top":0.06304868,"width":0.031914894,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code","depth":16,"bounds":{"left":0.065159574,"top":0.06304868,"width":0.027260639,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New chat ⌘N","depth":15,"bounds":{"left":0.005319149,"top":0.096568234,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"New chat","depth":16,"bounds":{"left":0.015292553,"top":0.09976058,"width":0.019281914,"height":0.013567438},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.015292553,"top":0.10055866,"width":0.0033244682,"height":0.013567438}},{"char_start":1,"char_count":7,"bounds":{"left":0.01861702,"top":0.10055866,"width":0.015957447,"height":0.013567438}}],"role_description":"text"},{"role":"AXStaticText","text":"⌘N","depth":17,"bounds":{"left":0.084109046,"top":0.10055866,"width":0.006981383,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Projects","depth":15,"bounds":{"left":0.005319149,"top":0.11731844,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Artifacts","depth":15,"bounds":{"left":0.005319149,"top":0.13806863,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Customize","depth":15,"bounds":{"left":0.005319149,"top":0.15881884,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Pinned","depth":16,"bounds":{"left":0.00731383,"top":0.19872306,"width":0.08510638,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Bulgarian citizenship application process for EU residents","depth":18,"bounds":{"left":0.005319149,"top":0.21548285,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Bulgarian citizenship application process for EU residents","depth":19,"bounds":{"left":0.08577128,"top":0.21867518,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Dawarich location tracking project","depth":18,"bounds":{"left":0.005319149,"top":0.23703113,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Dawarich location tracking project","depth":19,"bounds":{"left":0.08577128,"top":0.24022347,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Recents","depth":16,"bounds":{"left":0.00731383,"top":0.26735833,"width":0.064494684,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"View all","depth":16,"bounds":{"left":0.0731383,"top":0.26735833,"width":0.019281914,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hubspot BadRequest headers debugging","depth":18,"bounds":{"left":0.005319149,"top":0.28411812,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Hubspot BadRequest headers debugging","depth":19,"bounds":{"left":0.08577128,"top":0.28731045,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe sync script failing after recent migrations","depth":18,"bounds":{"left":0.005319149,"top":0.3056664,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe sync script failing after recent migrations","depth":19,"bounds":{"left":0.08577128,"top":0.30885875,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Monthly expense tracking","depth":18,"bounds":{"left":0.005319149,"top":0.3272147,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Monthly expense tracking","depth":19,"bounds":{"left":0.08577128,"top":0.33040702,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Exporting transaction data from Notion to finance hub","depth":18,"bounds":{"left":0.005319149,"top":0.34876296,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Exporting transaction data from Notion to finance hub","depth":19,"bounds":{"left":0.08577128,"top":0.3519553,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 How much have I spent for groc…","depth":18,"bounds":{"left":0.005319149,"top":0.37031126,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 How much have I spent for groc…","depth":19,"bounds":{"left":0.08577128,"top":0.3735036,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"April 2026 spending by category","depth":18,"bounds":{"left":0.005319149,"top":0.39185953,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for April 2026 spending by category","depth":19,"bounds":{"left":0.08577128,"top":0.39505187,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code diff review","depth":18,"bounds":{"left":0.005319149,"top":0.41340783,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Code diff review","depth":19,"bounds":{"left":0.08577128,"top":0.41660017,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HubSpot rate limit implementation strategy","depth":18,"bounds":{"left":0.005319149,"top":0.4349561,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for HubSpot rate limit implementation strategy","depth":19,"bounds":{"left":0.08577128,"top":0.43814844,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe retention policy code location","depth":18,"bounds":{"left":0.005319149,"top":0.45650437,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe retention policy code location","depth":19,"bounds":{"left":0.08577128,"top":0.45969674,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Viewing retention policy in screenpipe","depth":18,"bounds":{"left":0.005319149,"top":0.47805268,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Viewing retention policy in screenpipe","depth":19,"bounds":{"left":0.08577128,"top":0.481245,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Clean shot x video recording termination issue","depth":18,"bounds":{"left":0.005319149,"top":0.49960095,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Clean shot x video recording termination issue","depth":19,"bounds":{"left":0.08577128,"top":0.5027933,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HubSpot rate limit handling with executeRequest","depth":18,"bounds":{"left":0.005319149,"top":0.5211492,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for HubSpot rate limit handling with executeRequest","depth":19,"bounds":{"left":0.08577128,"top":0.5243416,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Untitled","depth":18,"bounds":{"left":0.005319149,"top":0.54269755,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options","depth":19,"bounds":{"left":0.08577128,"top":0.54588985,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 Screen pipe. Is there ability…","depth":18,"bounds":{"left":0.005319149,"top":0.5642458,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 Screen pipe. Is there ability…","depth":19,"bounds":{"left":0.08577128,"top":0.5674381,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"SMB mount access inconsistency between Finder and iTerm","depth":18,"bounds":{"left":0.005319149,"top":0.5857941,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for SMB mount access inconsistency between Finder and iTerm","depth":19,"bounds":{"left":0.08577128,"top":0.58898646,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 What is the best switch I can…","depth":18,"bounds":{"left":0.005319149,"top":0.60734236,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 What is the best switch I can…","depth":19,"bounds":{"left":0.08577128,"top":0.6105347,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Permission denied on screenpipe volume","depth":18,"bounds":{"left":0.005319149,"top":0.62889063,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Permission denied on screenpipe volume","depth":19,"bounds":{"left":0.08577128,"top":0.632083,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe sync database attachment error","depth":18,"bounds":{"left":0.005319149,"top":0.65043896,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe sync database attachment error","depth":19,"bounds":{"left":0.08577128,"top":0.65363127,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Last swimming outing with Dani","depth":18,"bounds":{"left":0.005319149,"top":0.67198724,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Last swimming outing with Dani","depth":19,"bounds":{"left":0.08577128,"top":0.67517954,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Definition of incarcerated","depth":18,"bounds":{"left":0.005319149,"top":0.6935355,"width":0.087765954,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Definition of incarcerated","depth":19,"bounds":{"left":0.08577128,"top":0.6967279,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Lukas Pro","depth":15,"bounds":{"left":0.005319149,"top":0.9696728,"width":0.038231384,"height":0.01915403},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Get apps and extensions","depth":15,"bounds":{"left":0.08510638,"top":0.9696728,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe sync script failing after recent migrations, rename chat","depth":19,"bounds":{"left":0.10239362,"top":0.02793296,"width":0.119015954,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Screenpipe sync script failing after recent migrations","depth":21,"bounds":{"left":0.10372341,"top":0.031923383,"width":0.11635638,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.10372341,"top":0.031923383,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":53,"bounds":{"left":0.106715426,"top":0.031923383,"width":0.113696806,"height":0.014365523}}],"role_description":"text"},{"role":"AXPopUpButton","text":"More options for Screenpipe sync script failing after recent migrations","depth":19,"bounds":{"left":0.22174202,"top":0.02793296,"width":0.006981383,"height":0.022346368},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open sidebar","depth":21,"bounds":{"left":0.47340426,"top":0.026336791,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Share chat","depth":21,"bounds":{"left":0.48537233,"top":0.026336791,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Claude finished the response","depth":21,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"You said: after recent updated in screenpipe (find out what are these) I am unable to run script.","depth":20,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"You said: after recent updated in screenpipe (find out what are these) I am unable to run script.","depth":21,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Pasted Text, pasted, 353 lines","depth":21,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#!/bin/bash # screenpipe_sync.sh # Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions). # Also copies the day's video/frame data folder to the NAS. # # Usage: # ./screenpipe_sync.sh # syncs yesterday (default) # ./screenpipe_sync.sh 2026-04-15 # sync","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PASTED","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"after recent updated in screenpipe (find out what are these) I am unable to run script. (pasted) \"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-05-07\n[2026-05-10 11:50:45] ========================================\n[2026-05-10 11:50:45] Screenpipe sync starting for: 2026-05-07\n[2026-05-10 11:50:45] ========================================\n[+00m00s] ▶ Preflight checks\n Source DB: OK (2.2G)\n NAS mount: OK /Volumes/screenpipe\n Archive DB: exists ( 10G)\n Data dir: OK (266 files, 292M)\n[+00m05s] ▶ Counting source rows for 2026-05-07\n frames: 6262\n elements: 623002\n ui_events: 7412\n ocr_text: 1670\n meetings: 2\n[+00m05s] ▶ Initialising tables, indexes, FTS\n creating tables ✓ 0m00s\n creating indexes ✓ 0m01s\n creating FTS tables ✓ 0m00s\n[+00m06s] ▶ Syncing data for 2026-05-07\n video_chunks ✓ 0m01s\n frames (6262 rows) ⠋ Parse error near line 3: table nas.frames has 24 columns but 30 values were supplied\" There were some recent changes in migrations. Here are migrations form the begining of march (approx after I installed irt first time) 20260301000000 create elements table 2026-05-06 17:27:34 True 736637f38c6e0b5547f23c870ebbc3e87ef2d8d33b22ce73f7 ... 1302167\n20260301100000 fts external content 2026-05-06 17:27:34 True 44ca0e5fc3b23c19aa09d7ac3fea48de604032d5feced2615c ... 2102875\n20260301200000 drop ui monitoring 2026-05-06 17:27:34 True 9ab8a4d8c0d602b491ef1a6ff36076fd7b7c12c05848201682 ... 620375\n20260306000000 delete empty transcriptions 2026-05-06 17:27:34 True 5f991a21d663157a2bce5cb9f0729f02181eef817aaef5a0b8 ... 166792\n20260309000000 add cloud blob id 2026-05-06 17:27:34 True e1588e32884ec5660d11bbaa995d767fb2172bb9732ad22319 ... 1450542\n20260310000000 create memories 2026-05-06 17:27:34 True 4fd07e878de1dd5b8d184e7bca9ee4e6b2480bbf39e5a68ff7 ... 1135416\n20260311000000 drop unused tables 2026-05-06 17:27:34 True 3d9eb9d327a61c4055b31e22082cd045e00bd7a875cbdee86b ... 547625\n20260312000000 consolidate search to frames full text 2026-05-06 17:27:34 True 5a7a31a359e9e93978d46ab4759fc8cd43898c0fd325d001b7 ... 3038250\n20260312000001 drop dead fts tables 2026-05-06 17:27:34 True dd8264b96b4427f40b06ac60b813b77b6d055b24dd727212c5 ... 297250\n20260312000002 drop accessibility tags 2026-05-06 17:27:34 True 672b2661f7e0fc8026f2eb6cc5d24935a15db4ed4982aeb973 ... 260167\n20260315000000 add frame id to memories 2026-05-06 17:27:34 True f324ec7981134e647b6497126a2b6a7467e94d271d140d0d25 ... 642250\n20260316000000 add elements activity summary index 2026-05-06 17:27:34 True 5b3f99a0d58fc73d62f240319d0718963364fdee1e3a7c4866 ... 265834\n20260317000000 add elements automation props 2026-05-06 17:27:34 True 4bd132d263de143c7bb0dcf2e3b8074606c58c0f79e6091d13 ... 537750\n20260318000000 add elements ref frame id 2026-05-06 17:27:34 True 33282b2c342e4743f096d1e3093146e243d97f392fe4df2cb5 ... 525250\n20260319000000 add sync id indexes 2026-05-06 17:27:34 True 22c7a18c918cfcc458f05fdbfe2a0b2bb65a67ae9daeec6028 ... 407083\n20260320000000 add note to meetings 2026-05-06 17:27:34 True cfa45b4c98e300c40cd36942839aa20528f47ae3e7b9c86751 ... 519625\n20260324000000 drop ocr text delete trigger 2026-05-06 17:27:34 True 99f445308168fc88f993c43f8e884cc4dc7e41411c86b4d3e7 ... 182209\n20260326000000 add session path to pipe executions 2026-05-06 17:27:34 True 5aa266dfcd7b741a18dd3ffb6b0ca3caf2e569959074cbc3ff ... 549583\n20260411000000 add elements ref frame id index 2026-05-06 17:27:34 True 378589322920e74980ea48c6b44c916cd488e47a8f6172161e ... 232083\n20260415000000 frames fts external content 2026-05-06 17:27:34 True 3fdac70da2fd44bca3c3717768b57c4cbee743451b73f13de9 ... 1259250\n20260423000000 add speaker id indexes 2026-05-06 17:27:34 True 80e8e0cf144ee620c81b3796196ca22b8e34f9c152ca2ffe8f ... 398709\n20260429000000 add evicted at to chunks 2026-05-06 17:27:34 True 180b1d44305df17620929a69ecce60fa3ce0148905adf19ff7 ... 963833\n20260502000000 add elements on screen 2026-05-06 17:27:34 True 2cf51a077a75ef32e4e1d722092053ce919bdeee151d3d91fb ... 644500\n20260504120000 add document path column 2026-05-06 17:27:34 True d84f7127e1647984eeb1f89e8dffd0918525f128e4608d323f ... 593042\n20260506120000 add memories sync columns 2026-05-07 06:45:22 True 800beaaa228c7fbd88fe367dc5b357adb72a3a0635da5a30f4 ... 1777417\n20260501000000 add redacted columns 2026-05-08 06:25:45 True 2a4cd6714a2322ccf8f2af6084af5a05e40f460c44c1aaf874 ... 795120667\n20260503000000 add frames image redacted 2026-05-08 06:25:45 True . It worked up to the point where I attemtped to remove it and install again since the retention policy doesn't clear old data and it was to big. I am basically moving data to nas and query it form there. mac is for capture only or lets say one week query using claude code. THe main consumer and interface is on nas. How to make it work so new changes won't messup my setup. Seems like I removed the whole folder it was working find runnign with @letest even I may be wrong.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Show more","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10 May","depth":22,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Retry","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Edit","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Copy","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Claude responded: Looking at this carefully, the error tells the whole story:","depth":21,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Claude responded: Looking at this carefully, the error tells the whole story:","depth":22,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Pinpointing schema mismatches from recent PII redaction migrations","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Pinpointing schema mismatches from recent PII redaction migrations","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Looking at this carefully, the error tells the whole story:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy to clipboard","depth":27,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"table nas.frames has 24 columns but 30 values were supplied","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Your source DB got 6 new columns from recent migrations, but the NAS archive was created earlier with the old schema.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CREATE TABLE IF NOT EXISTS","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is a no-op when the table exists, so the NAS schema is frozen at whatever it was when first created. Then","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"INSERT ... SELECT *","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"does positional mapping, which blows up the moment column counts diverge.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Let me verify the recent screenpipe changes and then fix this properly.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Diagnosed schema drift, architected resilient migration strategy","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Diagnosed schema drift, architected resilient migration strategy","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"What's happening","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"What's happening","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The error is schema drift, not a screenpipe bug. Your source DB grew 6 columns from these migrations (most landed late April / early May with the PII work):","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"20260429000000 add evicted at to chunks","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"→","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks.evicted_at","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"20260502000000 add elements on screen","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"→","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"elements.on_screen","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"20260504120000 add document path column","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"→","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"frames.document_path","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"20260501000000 add redacted columns","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"→ redacted columns on frames/ocr_text/elements (this is the big one — accompanies the new","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe/pii-redactor","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"model)","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"20260503000000 add frames image redacted","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"→","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"frames.image_redacted_path","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"20260506120000 add memories sync columns","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"→ memories table","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Your NAS","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"was created before these landed.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CREATE TABLE IF NOT EXISTS","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is a no-op on existing tables, so the NAS schema froze. Then","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"INSERT INTO nas.frames SELECT * FROM main.frames","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"does","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"positional","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"mapping → 30 source values into a 24-column NAS table → parse error.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"You weren't wrong about","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"npx screenpipe@latest","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"working: removing the folder gave you a fresh local DB with the new schema, and querying still works because everything is on one schema. The mismatch only surfaces when you try to merge old + new schemas via the sync.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"The fix","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"The fix","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Two changes make this future-proof:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ensure_columns","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— before each insert, diff source vs NAS columns and run","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ALTER TABLE ADD COLUMN","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"for any new ones. SQLite handles this as a metadata-only op, so it's instant even on your 10G archive.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explicit column lists in INSERT","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— never","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SELECT *","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"again. Build the column list dynamically from","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PRAGMA table_info(<table>)","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"and use","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"INSERT INTO t (cols) SELECT cols FROM ...","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":". Now positional drift is structurally impossible.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bonus: dropped columns in future migrations will also be handled gracefully — the archive keeps the column with NULLs for new rows, no errors.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Let me write the updated script.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Created a file, ran a command, read a file","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Created a file, ran a command, read a file","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"What changed in the script","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"What changed in the script","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Three additions, everything else preserved:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Schema helpers","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"(","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"table_columns_with_types","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"table_columns","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"table_exists","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ensure_columns","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"build_col_list","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":") — pure bash + sqlite3 PRAGMA, no extra deps.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"New \"Reconciling NAS schema with source\" step","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— runs after","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CREATE TABLE IF NOT EXISTS","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", before indexes/FTS/inserts. For each table in","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SYNC_TABLES","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", it diffs source columns against NAS and","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ALTER TABLE ADD COLUMN","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"s the missing ones. Output looks like:","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy to clipboard","depth":27,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"schema: frames ✓ added 4: cloud_blob_id document_path image_redacted_path text_redacted","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"schema: elements ✓ added 2: on_screen text_redacted","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"schema: video_chunks ✓ added 1: evicted_at","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Explicit column lists in every INSERT","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"—","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FRAMES_COLS=$(build_col_list frames)","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"builds","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"\"id\",\"timestamp\",\"app_name\",...","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"from source","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PRAGMA table_info","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", and the inserts use","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"INSERT INTO nas.t (cols) SELECT cols FROM main.t","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":". No more positional mapping. Column names are double-quoted so any future hyphens or reserved-word columns won't break parsing.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"What to expect on the next run","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"What to expect on the next run","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"First run after dropping it in: the \"Reconciling NAS schema with source\" step will print the missing columns it adds to your existing 10G archive (4 on","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", plus a few on","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"elements","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"video_chunks","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ocr_text","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"). Each","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ALTER TABLE ADD COLUMN","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is a metadata-only op in SQLite — no table rewrite, no VACUUM needed, total cost should be sub-second even on the 10G file. Then 2026-05-07 will sync normally.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"After that, when Screenpipe ships the next migration, your sync just picks up the new columns automatically. No more breakage.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"One thing worth knowing","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"One thing worth knowing","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"If Screenpipe ever","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"drops","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"a column in source (rare but possible — they did","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"drop ui monitoring","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"and","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"drop dead fts tables","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"earlier), the NAS will still have it, and","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"build_col_list","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"(sourced from","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"main","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":") won't reference it. New rows will have NULL for the orphaned column, old rows keep their data. That's the right archival behavior — but if you ever want to actually drop those orphan columns from NAS, that's a manual","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ALTER TABLE ... DROP COLUMN","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"which SQLite has supported since 3.35 (your macOS Tahoe ships 3.43+, and your NAS Docker SQLite is fine).","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"View Screenpipe sync","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Screenpipe sync","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SH","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Open Screenpipe sync","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Open in iTerm","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Give positive feedback","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Give negative feedback","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Retry","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"You said: ok but given the changes introduced is there something I may actually use","depth":20,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"You said: ok but given the changes introduced is there something I may actually use","depth":21,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ok but given the changes introduced is there something I may actually use","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"10 May","depth":22,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Retry","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Edit","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Copy","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Claude responded: Good question.","depth":21,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Claude responded: Good question.","depth":22,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Cataloging PII redactor capabilities and security categories","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Cataloging PII redactor capabilities and security categories","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Good question. Let me look at what these new columns actually do and which ones map to your setup, since not all of them are equal value for you.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Evaluated four practical database columns for his specific workflow needs","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Evaluated four practical database columns for his specific workflow needs","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Yeah, three of them are genuinely useful for your setup. The rest are cloud-sync plumbing you can ignore.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"frames.document_path — most useful for you","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"frames.document_path","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— most useful for you","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Captures the path of the document/file open at frame time. This is a meaningful upgrade over relying on","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app_name","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"window_name","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"for IDE work.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Concrete uses given your stack:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Daily activity summary","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":": instead of \"spent 2h in PhpStorm\", you can group by","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"document_path","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"and get \"spent 2h in","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app/Http/Controllers/ReportsController.php","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"\" — directly tied to the JY-20458 work.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Ticket correlation","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":": branch names contain ticket IDs in PhpStorm window titles, but file paths are cleaner. Query","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"WHERE document_path LIKE '%/reports/%'","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"to slice by feature area.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Replaces some of the","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LIKE '%JY-%'","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"fishing","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":": your hyphenated-token issue with FTS5 mostly comes up in OCR text. For \"what was I working on\",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"document_path","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"skips OCR entirely.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Worth adding an index on the NAS:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy to clipboard","depth":27,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"sql","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CREATE","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"INDEX","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IF","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"NOT","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EXISTS","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"idx_frames_document_path","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ON","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"frames","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"(","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"document_path","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":")","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"WHERE","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"document_path","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IS","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"NOT","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"NULL","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":";","depth":28,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"elements.on_screen — directly useful for the meeting detector","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"elements.on_screen","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— directly useful for the meeting detector","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"This is a boolean for whether the element was actually visible (vs. in the accessibility tree but scrolled off / occluded / behind a collapsed panel).","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"For your","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"meeting-detector","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"pipeline:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Zoom's accessibility tree exposes","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"everyone","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"on the call, including names in collapsed roster panels. Adding","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"WHERE on_screen = 1","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"cuts the participant detector down to people whose name tile was actually rendered — much closer to \"who was visible during this segment\".","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"For daily summaries: weights time-on-element by visibility, so reading vs. having-a-tab-open look different.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Cheap to add, big signal-to-noise win.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"PII redaction columns (text_redacted etc.) — useful but with caveats","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"PII redaction columns (","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"text_redacted","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"etc.) — useful but with caveats","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The model behind these is","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe/pii-redactor","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", fine-tuned for accessibility trees, OCR'd screen text, and computer-use traces. Detects 12 categories including a","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"secret","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"class that catches passwords, API keys, JWTs, DB connection strings, and PRIVATE-KEY markers — exactly the stuff that leaks into your captures during Laravel/Salesforce/HubSpot dev work.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"For your setup, this maps well because:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The NAS archive is the consumer, queried by Claude Code agentically. Pointing those queries at","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"text_redacted","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"rather than","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"text","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"reduces the blast radius if a prompt or tool result ends up somewhere unexpected.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Your Mac captures Jiminny customer data on every call. Redacted text is safer for archival queries that don't need exact content (which is most of them).","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Caveats worth knowing before flipping it on:","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Probably opt-in.","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Migrations only added the columns; redaction itself almost certainly needs a flag (worth checking","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe record --help","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"for something like","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"--enable-pii-redaction","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"). Without enabling, the columns just stay NULL.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Over-redacts on short strings","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":": ~8% on accessibility/window titles, ~16% on long-form. Bulgarian names + Slovak surnames in your genealogy notes will likely trigger false positives. Keep the unredacted","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"text","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"column for cases where you need ground truth.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Model license is CC BY-NC 4.0","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— non-commercial only, so not suitable for anything Jiminny-business related; fine for personal use.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Practical pattern: query","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"text_redacted","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"by default, fall back to","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"text","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"only when you explicitly need the raw value.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"video_chunks.evicted_at — minor diagnostic value","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"video_chunks.evicted_at","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— minor diagnostic value","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"When the local retention policy prunes a chunk, this stamps the time. Given your 7-day retention + nightly sync to NAS, you could add a preflight check that warns if a chunk got evicted before its frames were synced (would mean you have frame metadata pointing to deleted video). Realistically your nightly sync at 3am is well inside the 7-day window, so this is more \"nice diagnostic\" than \"must-use\".","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Skip these","depth":24,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Skip these","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"frames.cloud_blob_id","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"memories sync columns","depth":27,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— for the optional E2EE cloud sync feature. You self-host, you don't need them. Stays NULL.","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"If you want, I can draft a small SQL migration for the NAS-side indexes (","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"document_path","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"on_screen","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":") and a tweaked version of your daily-activity-summary Claude Code prompt that uses","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"document_path","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"for grouping. Both are short.","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Give positive feedback","depth":22,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5181732736047373190
|
2751663336271283218
|
visual_change
|
accessibility
|
NULL
|
Skip to content
Skip to content
Click to collapse
Skip to content
Skip to content
Click to collapse
⌘B
Drag to resize
Collapse sidebar
Search
Chat
Cowork
Code
New chat ⌘N
New chat
⌘N
Projects
Artifacts
Customize
Pinned
Bulgarian citizenship application process for EU residents
More options for Bulgarian citizenship application process for EU residents
Dawarich location tracking project
More options for Dawarich location tracking project
Recents
View all
Hubspot BadRequest headers debugging
More options for Hubspot BadRequest headers debugging
Screenpipe sync script failing after recent migrations
More options for Screenpipe sync script failing after recent migrations
Monthly expense tracking
More options for Monthly expense tracking
Exporting transaction data from Notion to finance hub
More options for Exporting transaction data from Notion to finance hub
💬 How much have I spent for groc…
More options for 💬 How much have I spent for groc…
April 2026 spending by category
More options for April 2026 spending by category
Code diff review
More options for Code diff review
HubSpot rate limit implementation strategy
More options for HubSpot rate limit implementation strategy
Screenpipe retention policy code location
More options for Screenpipe retention policy code location
Viewing retention policy in screenpipe
More options for Viewing retention policy in screenpipe
Clean shot x video recording termination issue
More options for Clean shot x video recording termination issue
HubSpot rate limit handling with executeRequest
More options for HubSpot rate limit handling with executeRequest
Untitled
More options
💬 Screen pipe. Is there ability…
More options for 💬 Screen pipe. Is there ability…
SMB mount access inconsistency between Finder and iTerm
More options for SMB mount access inconsistency between Finder and iTerm
💬 What is the best switch I can…
More options for 💬 What is the best switch I can…
Permission denied on screenpipe volume
More options for Permission denied on screenpipe volume
Screenpipe sync database attachment error
More options for Screenpipe sync database attachment error
Last swimming outing with Dani
More options for Last swimming outing with Dani
Definition of incarcerated
More options for Definition of incarcerated
Lukas Pro
Get apps and extensions
Screenpipe sync script failing after recent migrations, rename chat
Screenpipe sync script failing after recent migrations
More options for Screenpipe sync script failing after recent migrations
Open sidebar
Share chat
Claude finished the response
You said: after recent updated in screenpipe (find out what are these) I am unable to run script.
You said: after recent updated in screenpipe (find out what are these) I am unable to run script.
Pasted Text, pasted, 353 lines
#!/bin/bash # screenpipe_sync.sh # Syncs Screenpipe SQLite data to a NAS archive database (append-only, no deletions). # Also copies the day's video/frame data folder to the NAS. # # Usage: # ./screenpipe_sync.sh # syncs yesterday (default) # ./screenpipe_sync.sh 2026-04-15 # sync
PASTED
after recent updated in screenpipe (find out what are these) I am unable to run script. (pasted) "lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ ~/.screenpipe/screenpipe_sync.sh 2026-05-07
[2026-05-10 11:50:45] ========================================
[2026-05-10 11:50:45] Screenpipe sync starting for: 2026-05-07
[2026-05-10 11:50:45] ========================================
[+00m00s] ▶ Preflight checks
Source DB: OK (2.2G)
NAS mount: OK /Volumes/screenpipe
Archive DB: exists ( 10G)
Data dir: OK (266 files, 292M)
[+00m05s] ▶ Counting source rows for 2026-05-07
frames: 6262
elements: 623002
ui_events: 7412
ocr_text: 1670
meetings: 2
[+00m05s] ▶ Initialising tables, indexes, FTS
creating tables ✓ 0m00s
creating indexes ✓ 0m01s
creating FTS tables ✓ 0m00s
[+00m06s] ▶ Syncing data for 2026-05-07
video_chunks ✓ 0m01s
frames (6262 rows) ⠋ Parse error near line 3: table nas.frames has 24 columns but 30 values were supplied" There were some recent changes in migrations. Here are migrations form the begining of march (approx after I installed irt first time) 20260301000000 create elements table 2026-05-06 17:27:34 True 736637f38c6e0b5547f23c870ebbc3e87ef2d8d33b22ce73f7 ... 1302167
20260301100000 fts external content 2026-05-06 17:27:34 True 44ca0e5fc3b23c19aa09d7ac3fea48de604032d5feced2615c ... 2102875
20260301200000 drop ui monitoring 2026-05-06 17:27:34 True 9ab8a4d8c0d602b491ef1a6ff36076fd7b7c12c05848201682 ... 620375
20260306000000 delete empty transcriptions 2026-05-06 17:27:34 True 5f991a21d663157a2bce5cb9f0729f02181eef817aaef5a0b8 ... 166792
20260309000000 add cloud blob id 2026-05-06 17:27:34 True e1588e32884ec5660d11bbaa995d767fb2172bb9732ad22319 ... 1450542
20260310000000 create memories 2026-05-06 17:27:34 True 4fd07e878de1dd5b8d184e7bca9ee4e6b2480bbf39e5a68ff7 ... 1135416
20260311000000 drop unused tables 2026-05-06 17:27:34 True 3d9eb9d327a61c4055b31e22082cd045e00bd7a875cbdee86b ... 547625
20260312000000 consolidate search to frames full text 2026-05-06 17:27:34 True 5a7a31a359e9e93978d46ab4759fc8cd43898c0fd325d001b7 ... 3038250
20260312000001 drop dead fts tables 2026-05-06 17:27:34 True dd8264b96b4427f40b06ac60b813b77b6d055b24dd727212c5 ... 297250
20260312000002 drop accessibility tags 2026-05-06 17:27:34 True 672b2661f7e0fc8026f2eb6cc5d24935a15db4ed4982aeb973 ... 260167
20260315000000 add frame id to memories 2026-05-06 17:27:34 True f324ec7981134e647b6497126a2b6a7467e94d271d140d0d25 ... 642250
20260316000000 add elements activity summary index 2026-05-06 17:27:34 True 5b3f99a0d58fc73d62f240319d0718963364fdee1e3a7c4866 ... 265834
20260317000000 add elements automation props 2026-05-06 17:27:34 True 4bd132d263de143c7bb0dcf2e3b8074606c58c0f79e6091d13 ... 537750
20260318000000 add elements ref frame id 2026-05-06 17:27:34 True 33282b2c342e4743f096d1e3093146e243d97f392fe4df2cb5 ... 525250
20260319000000 add sync id indexes 2026-05-06 17:27:34 True 22c7a18c918cfcc458f05fdbfe2a0b2bb65a67ae9daeec6028 ... 407083
20260320000000 add note to meetings 2026-05-06 17:27:34 True cfa45b4c98e300c40cd36942839aa20528f47ae3e7b9c86751 ... 519625
20260324000000 drop ocr text delete trigger 2026-05-06 17:27:34 True 99f445308168fc88f993c43f8e884cc4dc7e41411c86b4d3e7 ... 182209
20260326000000 add session path to pipe executions 2026-05-06 17:27:34 True 5aa266dfcd7b741a18dd3ffb6b0ca3caf2e569959074cbc3ff ... 549583
20260411000000 add elements ref frame id index 2026-05-06 17:27:34 True 378589322920e74980ea48c6b44c916cd488e47a8f6172161e ... 232083
20260415000000 frames fts external content 2026-05-06 17:27:34 True 3fdac70da2fd44bca3c3717768b57c4cbee743451b73f13de9 ... 1259250
20260423000000 add speaker id indexes 2026-05-06 17:27:34 True 80e8e0cf144ee620c81b3796196ca22b8e34f9c152ca2ffe8f ... 398709
20260429000000 add evicted at to chunks 2026-05-06 17:27:34 True 180b1d44305df17620929a69ecce60fa3ce0148905adf19ff7 ... 963833
20260502000000 add elements on screen 2026-05-06 17:27:34 True 2cf51a077a75ef32e4e1d722092053ce919bdeee151d3d91fb ... 644500
20260504120000 add document path column 2026-05-06 17:27:34 True d84f7127e1647984eeb1f89e8dffd0918525f128e4608d323f ... 593042
20260506120000 add memories sync columns 2026-05-07 06:45:22 True 800beaaa228c7fbd88fe367dc5b357adb72a3a0635da5a30f4 ... 1777417
20260501000000 add redacted columns 2026-05-08 06:25:45 True 2a4cd6714a2322ccf8f2af6084af5a05e40f460c44c1aaf874 ... 795120667
20260503000000 add frames image redacted 2026-05-08 06:25:45 True . It worked up to the point where I attemtped to remove it and install again since the retention policy doesn't clear old data and it was to big. I am basically moving data to nas and query it form there. mac is for capture only or lets say one week query using claude code. THe main consumer and interface is on nas. How to make it work so new changes won't messup my setup. Seems like I removed the whole folder it was working find runnign with @letest even I may be wrong.
Show more
10 May
Retry
Edit
Copy
Claude responded: Looking at this carefully, the error tells the whole story:
Claude responded: Looking at this carefully, the error tells the whole story:
Pinpointing schema mismatches from recent PII redaction migrations
Pinpointing schema mismatches from recent PII redaction migrations
Looking at this carefully, the error tells the whole story:
Copy to clipboard
table nas.frames has 24 columns but 30 values were supplied
Your source DB got 6 new columns from recent migrations, but the NAS archive was created earlier with the old schema.
CREATE TABLE IF NOT EXISTS
is a no-op when the table exists, so the NAS schema is frozen at whatever it was when first created. Then
INSERT ... SELECT *
does positional mapping, which blows up the moment column counts diverge.
Let me verify the recent screenpipe changes and then fix this properly.
Diagnosed schema drift, architected resilient migration strategy
Diagnosed schema drift, architected resilient migration strategy
What's happening
What's happening
The error is schema drift, not a screenpipe bug. Your source DB grew 6 columns from these migrations (most landed late April / early May with the PII work):
20260429000000 add evicted at to chunks
→
video_chunks.evicted_at
20260502000000 add elements on screen
→
elements.on_screen
20260504120000 add document path column
→
frames.document_path
20260501000000 add redacted columns
→ redacted columns on frames/ocr_text/elements (this is the big one — accompanies the new
screenpipe/pii-redactor
model)
20260503000000 add frames image redacted
→
frames.image_redacted_path
20260506120000 add memories sync columns
→ memories table
Your NAS
archive.db
was created before these landed.
CREATE TABLE IF NOT EXISTS
is a no-op on existing tables, so the NAS schema froze. Then
INSERT INTO nas.frames SELECT * FROM main.frames
does
positional
mapping → 30 source values into a 24-column NAS table → parse error.
You weren't wrong about
npx screenpipe@latest
working: removing the folder gave you a fresh local DB with the new schema, and querying still works because everything is on one schema. The mismatch only surfaces when you try to merge old + new schemas via the sync.
The fix
The fix
Two changes make this future-proof:
ensure_columns
— before each insert, diff source vs NAS columns and run
ALTER TABLE ADD COLUMN
for any new ones. SQLite handles this as a metadata-only op, so it's instant even on your 10G archive.
Explicit column lists in INSERT
— never
SELECT *
again. Build the column list dynamically from
PRAGMA table_info(<table>)
and use
INSERT INTO t (cols) SELECT cols FROM ...
. Now positional drift is structurally impossible.
Bonus: dropped columns in future migrations will also be handled gracefully — the archive keeps the column with NULLs for new rows, no errors.
Let me write the updated script.
Created a file, ran a command, read a file
Created a file, ran a command, read a file
What changed in the script
What changed in the script
Three additions, everything else preserved:
Schema helpers
(
table_columns_with_types
,
table_columns
,
table_exists
,
ensure_columns
,
build_col_list
) — pure bash + sqlite3 PRAGMA, no extra deps.
New "Reconciling NAS schema with source" step
— runs after
CREATE TABLE IF NOT EXISTS
, before indexes/FTS/inserts. For each table in
SYNC_TABLES
, it diffs source columns against NAS and
ALTER TABLE ADD COLUMN
s the missing ones. Output looks like:
Copy to clipboard
schema: frames ✓ added 4: cloud_blob_id document_path image_redacted_path text_redacted
schema: elements ✓ added 2: on_screen text_redacted
schema: video_chunks ✓ added 1: evicted_at
Explicit column lists in every INSERT
—
FRAMES_COLS=$(build_col_list frames)
builds
"id","timestamp","app_name",...
from source
PRAGMA table_info
, and the inserts use
INSERT INTO nas.t (cols) SELECT cols FROM main.t
. No more positional mapping. Column names are double-quoted so any future hyphens or reserved-word columns won't break parsing.
What to expect on the next run
What to expect on the next run
First run after dropping it in: the "Reconciling NAS schema with source" step will print the missing columns it adds to your existing 10G archive (4 on
frames
, plus a few on
elements
/
video_chunks
/
ocr_text
). Each
ALTER TABLE ADD COLUMN
is a metadata-only op in SQLite — no table rewrite, no VACUUM needed, total cost should be sub-second even on the 10G file. Then 2026-05-07 will sync normally.
After that, when Screenpipe ships the next migration, your sync just picks up the new columns automatically. No more breakage.
One thing worth knowing
One thing worth knowing
If Screenpipe ever
drops
a column in source (rare but possible — they did
drop ui monitoring
and
drop dead fts tables
earlier), the NAS will still have it, and
build_col_list
(sourced from
main
) won't reference it. New rows will have NULL for the orphaned column, old rows keep their data. That's the right archival behavior — but if you ever want to actually drop those orphan columns from NAS, that's a manual
ALTER TABLE ... DROP COLUMN
which SQLite has supported since 3.35 (your macOS Tahoe ships 3.43+, and your NAS Docker SQLite is fine).
View Screenpipe sync
Screenpipe sync
SH
Open Screenpipe sync
Open in iTerm
Copy
Give positive feedback
Give negative feedback
Retry
You said: ok but given the changes introduced is there something I may actually use
You said: ok but given the changes introduced is there something I may actually use
ok but given the changes introduced is there something I may actually use
10 May
Retry
Edit
Copy
Claude responded: Good question.
Claude responded: Good question.
Cataloging PII redactor capabilities and security categories
Cataloging PII redactor capabilities and security categories
Good question. Let me look at what these new columns actually do and which ones map to your setup, since not all of them are equal value for you.
Evaluated four practical database columns for his specific workflow needs
Evaluated four practical database columns for his specific workflow needs
Yeah, three of them are genuinely useful for your setup. The rest are cloud-sync plumbing you can ignore.
frames.document_path — most useful for you
frames.document_path
— most useful for you
Captures the path of the document/file open at frame time. This is a meaningful upgrade over relying on
app_name
+
window_name
for IDE work.
Concrete uses given your stack:
Daily activity summary
: instead of "spent 2h in PhpStorm", you can group by
document_path
and get "spent 2h in
app/Http/Controllers/ReportsController.php
" — directly tied to the JY-20458 work.
Ticket correlation
: branch names contain ticket IDs in PhpStorm window titles, but file paths are cleaner. Query
WHERE document_path LIKE '%/reports/%'
to slice by feature area.
Replaces some of the
LIKE '%JY-%'
fishing
: your hyphenated-token issue with FTS5 mostly comes up in OCR text. For "what was I working on",
document_path
skips OCR entirely.
Worth adding an index on the NAS:
Copy to clipboard
sql
CREATE
INDEX
IF
NOT
EXISTS
idx_frames_document_path
ON
frames
(
document_path
)
WHERE
document_path
IS
NOT
NULL
;
elements.on_screen — directly useful for the meeting detector
elements.on_screen
— directly useful for the meeting detector
This is a boolean for whether the element was actually visible (vs. in the accessibility tree but scrolled off / occluded / behind a collapsed panel).
For your
meeting-detector
pipeline:
Zoom's accessibility tree exposes
everyone
on the call, including names in collapsed roster panels. Adding
WHERE on_screen = 1
cuts the participant detector down to people whose name tile was actually rendered — much closer to "who was visible during this segment".
For daily summaries: weights time-on-element by visibility, so reading vs. having-a-tab-open look different.
Cheap to add, big signal-to-noise win.
PII redaction columns (text_redacted etc.) — useful but with caveats
PII redaction columns (
text_redacted
etc.) — useful but with caveats
The model behind these is
screenpipe/pii-redactor
, fine-tuned for accessibility trees, OCR'd screen text, and computer-use traces. Detects 12 categories including a
secret
class that catches passwords, API keys, JWTs, DB connection strings, and PRIVATE-KEY markers — exactly the stuff that leaks into your captures during Laravel/Salesforce/HubSpot dev work.
For your setup, this maps well because:
The NAS archive is the consumer, queried by Claude Code agentically. Pointing those queries at
text_redacted
rather than
text
reduces the blast radius if a prompt or tool result ends up somewhere unexpected.
Your Mac captures Jiminny customer data on every call. Redacted text is safer for archival queries that don't need exact content (which is most of them).
Caveats worth knowing before flipping it on:
Probably opt-in.
Migrations only added the columns; redaction itself almost certainly needs a flag (worth checking
screenpipe record --help
for something like
--enable-pii-redaction
). Without enabling, the columns just stay NULL.
Over-redacts on short strings
: ~8% on accessibility/window titles, ~16% on long-form. Bulgarian names + Slovak surnames in your genealogy notes will likely trigger false positives. Keep the unredacted
text
column for cases where you need ground truth.
Model license is CC BY-NC 4.0
— non-commercial only, so not suitable for anything Jiminny-business related; fine for personal use.
Practical pattern: query
text_redacted
by default, fall back to
text
only when you explicitly need the raw value.
video_chunks.evicted_at — minor diagnostic value
video_chunks.evicted_at
— minor diagnostic value
When the local retention policy prunes a chunk, this stamps the time. Given your 7-day retention + nightly sync to NAS, you could add a preflight check that warns if a chunk got evicted before its frames were synced (would mean you have frame metadata pointing to deleted video). Realistically your nightly sync at 3am is well inside the 7-day window, so this is more "nice diagnostic" than "must-use".
Skip these
Skip these
frames.cloud_blob_id
,
memories sync columns
— for the optional E2EE cloud sync feature. You self-host, you don't need them. Stays NULL.
If you want, I can draft a small SQL migration for the NAS-side indexes (
document_path
,
on_screen
) and a tweaked version of your daily-activity-summary Claude Code prompt that uses
document_path
for grouping. Both are short.
Copy
Give positive feedback...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
21153
|
923
|
41
|
2026-05-11T17:15:37.445996+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778519737445_m2.jpg...
|
Finder
|
.screenpipe
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
Name
Date Modified
Size
Kind
db.sqlite
Today at 20:15
3,71 GB
Document
data
Today at 20:15
1,32 GB
Folder
data
Today at 7:54
1,04 GB
Folder
System Audio (output)_2026-05-11_09-15-05.mp4
Today at 12:15
272 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-53-58.mp4
Today at 9:54
270 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-50-35.mp4
Today at 9:51
269 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-54-42.mp4
Today at 9:55
269 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-52-06.mp4
Today at 9:52
268 KB
MPEG-4 movie
System Audio (output)_2026-05-11_07-01-03.mp4
Today at 10:01
268 KB
MPEG-4 movie...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Favourites","depth":6,"bounds":{"left":0.00930851,"top":0.061452515,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"jiminny","depth":6,"bounds":{"left":0.017287234,"top":0.08140463,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AirDrop","depth":6,"bounds":{"left":0.017287234,"top":0.103751,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Recents","depth":6,"bounds":{"left":0.017287234,"top":0.12609737,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Applications","depth":6,"bounds":{"left":0.017287234,"top":0.14844373,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Documents","depth":6,"bounds":{"left":0.017287234,"top":0.1707901,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Downloads","depth":6,"bounds":{"left":0.017287234,"top":0.19313647,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"lukas","depth":6,"bounds":{"left":0.017287234,"top":0.21548285,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"iCloud","depth":6,"bounds":{"left":0.00930851,"top":0.2434158,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"iCloud Drive","depth":6,"bounds":{"left":0.017287234,"top":0.26336792,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sync folder","depth":6,"bounds":{"left":0.017287234,"top":0.2857143,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Locations","depth":6,"bounds":{"left":0.00930851,"top":0.31364724,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"DXP4800PLUS-B5F","depth":6,"bounds":{"left":0.017287234,"top":0.33359936,"width":0.043218084,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Eject","depth":6,"bounds":{"left":0.061170213,"top":0.33519554,"width":0.0043218085,"height":0.009577015},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"Network","depth":6,"bounds":{"left":0.017287234,"top":0.35594574,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Tags","depth":6,"bounds":{"left":0.00930851,"top":0.38387868,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"CRM","depth":6,"bounds":{"left":0.017287234,"top":0.4038308,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Orange","depth":6,"bounds":{"left":0.017287234,"top":0.42617717,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Red","depth":6,"bounds":{"left":0.017287234,"top":0.44852355,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Yellow","depth":6,"bounds":{"left":0.017287234,"top":0.4708699,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Green","depth":6,"bounds":{"left":0.017287234,"top":0.49321628,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Blue","depth":6,"bounds":{"left":0.017287234,"top":0.51556265,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Purple","depth":6,"bounds":{"left":0.017287234,"top":0.53790903,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"All Tags…","depth":6,"bounds":{"left":0.017287234,"top":0.5602554,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Name","depth":7,"bounds":{"left":0.08743351,"top":0.06624102,"width":0.011635638,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Date Modified","depth":7,"bounds":{"left":0.37034574,"top":0.06624102,"width":0.025930852,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Size","depth":7,"bounds":{"left":0.43051863,"top":0.06624102,"width":0.008976064,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Kind","depth":7,"bounds":{"left":0.46276596,"top":0.06624102,"width":0.00930851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"db.sqlite","depth":7,"bounds":{"left":0.08743351,"top":0.08938547,"width":0.020279255,"height":0.012769354},"on_screen":true,"value":"db.sqlite","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 20:15","depth":7,"bounds":{"left":0.37034574,"top":0.08938547,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3,71 GB","depth":7,"bounds":{"left":0.44148937,"top":0.08938547,"width":0.017952127,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"bounds":{"left":0.46276596,"top":0.08938547,"width":0.023603724,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"data","depth":7,"bounds":{"left":0.08743351,"top":0.105347164,"width":0.011635638,"height":0.012769354},"on_screen":true,"value":"data","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 20:15","depth":7,"bounds":{"left":0.37034574,"top":0.105347164,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1,32 GB","depth":7,"bounds":{"left":0.44148937,"top":0.105347164,"width":0.017952127,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.46276596,"top":0.105347164,"width":0.014295213,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"data","depth":7,"bounds":{"left":0.09242021,"top":0.121308856,"width":0.011635638,"height":0.012769354},"on_screen":true,"value":"data","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 7:54","depth":7,"bounds":{"left":0.37034574,"top":0.121308856,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1,04 GB","depth":7,"bounds":{"left":0.44148937,"top":0.121308856,"width":0.017952127,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"bounds":{"left":0.46276596,"top":0.121308856,"width":0.014295213,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"System Audio (output)_2026-05-11_09-15-05.mp4","depth":7,"bounds":{"left":0.09242021,"top":0.13727055,"width":0.10638298,"height":0.012769354},"on_screen":true,"value":"System Audio (output)_2026-05-11_09-15-05.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 12:15","depth":7,"bounds":{"left":0.37034574,"top":0.13727055,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"272 KB","depth":7,"bounds":{"left":0.4431516,"top":0.13727055,"width":0.016289894,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MPEG-4 movie","depth":7,"bounds":{"left":0.46276596,"top":0.13727055,"width":0.032912236,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"System Audio (output)_2026-05-11_06-53-58.mp4","depth":7,"bounds":{"left":0.09242021,"top":0.15323225,"width":0.10704787,"height":0.012769354},"on_screen":true,"value":"System Audio (output)_2026-05-11_06-53-58.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 9:54","depth":7,"bounds":{"left":0.37034574,"top":0.15323225,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"270 KB","depth":7,"bounds":{"left":0.4431516,"top":0.15323225,"width":0.016289894,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MPEG-4 movie","depth":7,"bounds":{"left":0.46276596,"top":0.15323225,"width":0.032912236,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"System Audio (output)_2026-05-11_06-50-35.mp4","depth":7,"bounds":{"left":0.09242021,"top":0.16919394,"width":0.10704787,"height":0.012769354},"on_screen":true,"value":"System Audio (output)_2026-05-11_06-50-35.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 9:51","depth":7,"bounds":{"left":0.37034574,"top":0.16919394,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"269 KB","depth":7,"bounds":{"left":0.4431516,"top":0.16919394,"width":0.016289894,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MPEG-4 movie","depth":7,"bounds":{"left":0.46276596,"top":0.16919394,"width":0.032912236,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"System Audio (output)_2026-05-11_06-54-42.mp4","depth":7,"bounds":{"left":0.09242021,"top":0.18515563,"width":0.10704787,"height":0.012769354},"on_screen":true,"value":"System Audio (output)_2026-05-11_06-54-42.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 9:55","depth":7,"bounds":{"left":0.37034574,"top":0.18515563,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"269 KB","depth":7,"bounds":{"left":0.4431516,"top":0.18515563,"width":0.016289894,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MPEG-4 movie","depth":7,"bounds":{"left":0.46276596,"top":0.18515563,"width":0.032912236,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"System Audio (output)_2026-05-11_06-52-06.mp4","depth":7,"bounds":{"left":0.09242021,"top":0.20111732,"width":0.10704787,"height":0.012769354},"on_screen":true,"value":"System Audio (output)_2026-05-11_06-52-06.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 9:52","depth":7,"bounds":{"left":0.37034574,"top":0.20111732,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"268 KB","depth":7,"bounds":{"left":0.4431516,"top":0.20111732,"width":0.016289894,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MPEG-4 movie","depth":7,"bounds":{"left":0.46276596,"top":0.20111732,"width":0.032912236,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"System Audio (output)_2026-05-11_07-01-03.mp4","depth":7,"bounds":{"left":0.09242021,"top":0.21707901,"width":0.10605053,"height":0.012769354},"on_screen":true,"value":"System Audio (output)_2026-05-11_07-01-03.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 10:01","depth":7,"bounds":{"left":0.37034574,"top":0.21707901,"width":0.056848403,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"268 KB","depth":7,"bounds":{"left":0.4431516,"top":0.21707901,"width":0.016289894,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MPEG-4 movie","depth":7,"bounds":{"left":0.46276596,"top":0.21707901,"width":0.032912236,"height":0.012769354},"on_screen":true,"role_description":"text"}]...
|
643920488180423922
|
-6731048739844591699
|
app_switch
|
accessibility
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
Name
Date Modified
Size
Kind
db.sqlite
Today at 20:15
3,71 GB
Document
data
Today at 20:15
1,32 GB
Folder
data
Today at 7:54
1,04 GB
Folder
System Audio (output)_2026-05-11_09-15-05.mp4
Today at 12:15
272 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-53-58.mp4
Today at 9:54
270 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-50-35.mp4
Today at 9:51
269 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-54-42.mp4
Today at 9:55
269 KB
MPEG-4 movie
System Audio (output)_2026-05-11_06-52-06.mp4
Today at 9:52
268 KB
MPEG-4 movie
System Audio (output)_2026-05-11_07-01-03.mp4
Today at 10:01
268 KB
MPEG-4 movie...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
21578
|
943
|
41
|
2026-05-11T18:06:34.235123+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778522794235_m2.jpg...
|
Firefox
|
SQLite Web: db.sqlite — Personal
|
True
|
sqlite.screenpipe.lakylak.xyz/audio_tags/content/
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
All docs · AFFiNE
All docs · AFFiNE
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
SQLite Web: archive.db
SQLite Web: archive.db
SQLite Web: db.sqlite
SQLite Web: db.sqlite
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
sqlite-web 0.7.2
sqlite-web 0.7.2
db.sqlite
db.sqlite
audio_tags
0 rows, showing page 1
Query
Query
table name...
_sqlx_migrations
_sqlx_migrations
audio_chunks
audio_chunks
audio_tags
audio_tags
audio_transcriptions
audio_transcriptions
audio_transcriptions_fts (v)
audio_transcriptions_fts
(v)
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
elements
elements
elements_fts (v)
elements_fts
(v)
elements_fts_config
elements_fts_config
elements_fts_data
elements_fts_data
elements_fts_idx
elements_fts_idx
frames
frames
frames_fts (v)
frames_fts
(v)
frames_fts_config
frames_fts_config
frames_fts_data
frames_fts_data
frames_fts_idx
frames_fts_idx
meetings
meetings
memories
memories
memories_fts (v)
memories_fts
(v)
memories_fts_config
memories_fts_config
memories_fts_data
memories_fts_data
memories_fts_idx
memories_fts_idx
ocr_text
ocr_text
pipe_executions
pipe_executions
pipe_scheduler_state
pipe_scheduler_state
secrets
secrets
speaker_embeddings
speaker_embeddings
speakers
speakers
sqlite_sequence
sqlite_sequence
sqlite_stat1
sqlite_stat1
sqlite_stat4
sqlite_stat4
tags
tags
ui_events
ui_events
ui_events_fts (v)
ui_events_fts
(v)
ui_events_fts_config
ui_events_fts_config
ui_events_fts_data
ui_events_fts_data
ui_events_fts_idx
ui_events_fts_idx
video_chunks
video_chunks
vision_tags
vision_tags
Toggle helper tables
Toggle helper tables
Structure
Structure
Content
Content
Query
Query
Export
Export
audio_chunk_id
audio_chunk_id
tag_id
tag_id
audio_chunk_id
audio_chunk_id
tag_id
tag_id
«
«
‹
‹
Page 1 / 1
›
›
»
»
SQLite database browser
v0.7.2
, powered by
Flask
Flask
and
Peewee
Peewee
. © 2026
Charles Leifer
Charles Leifer
sqlite.screenpipe.lakylak.xyz/speaker_embeddings/...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.5,"top":0.0518755,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.51329786,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.5,"top":0.08459697,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.51329786,"top":0.09577015,"width":0.037898935,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"All docs · AFFiNE","depth":4,"bounds":{"left":0.5,"top":0.11731844,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All docs · AFFiNE","depth":5,"bounds":{"left":0.51329786,"top":0.12849163,"width":0.029587766,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"bounds":{"left":0.5,"top":0.15003991,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":5,"bounds":{"left":0.51329786,"top":0.16121309,"width":0.036901597,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.5,"top":0.18276137,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.51329786,"top":0.19393456,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.5,"top":0.21548285,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.51329786,"top":0.22665602,"width":0.037898935,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SQLite Web: archive.db","depth":4,"bounds":{"left":0.5,"top":0.2482043,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SQLite Web: archive.db","depth":5,"bounds":{"left":0.51329786,"top":0.25937748,"width":0.040724736,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"SQLite Web: db.sqlite","depth":4,"bounds":{"left":0.5,"top":0.28092578,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"SQLite Web: db.sqlite","depth":5,"bounds":{"left":0.51329786,"top":0.29209897,"width":0.03756649,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.55651593,"top":0.28810853,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.5028258,"top":0.31524342,"width":0.06333112,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.5028258,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.51379657,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.5249335,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.53607047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.5472075,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"sqlite-web 0.7.2","depth":7,"bounds":{"left":0.57413566,"top":0.0,"width":0.043218084,"height":0.030726258},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sqlite-web 0.7.2","depth":8,"bounds":{"left":0.57413566,"top":0.0,"width":0.043218084,"height":0.017956903},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"db.sqlite","depth":10,"bounds":{"left":0.62267286,"top":0.0,"width":0.023936171,"height":0.029928172},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"db.sqlite","depth":11,"bounds":{"left":0.6253325,"top":0.0,"width":0.01861702,"height":0.01396648},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"audio_tags","depth":10,"bounds":{"left":0.64660907,"top":0.0,"width":0.024102394,"height":0.01396648},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0 rows, showing page 1","depth":9,"bounds":{"left":0.67204124,"top":0.0,"width":0.045711435,"height":0.012370312},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Query","depth":8,"bounds":{"left":0.97639626,"top":0.0,"width":0.018284574,"height":0.023543496},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Query","depth":9,"bounds":{"left":0.9793883,"top":0.0,"width":0.012300532,"height":0.012769354},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"table name...","depth":7,"bounds":{"left":0.5738032,"top":0.0,"width":0.061835106,"height":0.023942538},"on_screen":false,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"_sqlx_migrations","depth":9,"bounds":{"left":0.5738032,"top":0.0,"width":0.06200133,"height":0.022745412},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"_sqlx_migrations","depth":10,"bounds":{"left":0.57712764,"top":0.0,"width":0.038896278,"height":0.014764565},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_chunks","depth":9,"bounds":{"left":0.5738032,"top":0.013567438,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_chunks","depth":10,"bounds":{"left":0.57712764,"top":0.017557861,"width":0.031416222,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_tags","depth":9,"bounds":{"left":0.5738032,"top":0.03631285,"width":0.06200133,"height":0.02434158},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_tags","depth":10,"bounds":{"left":0.5774601,"top":0.041101355,"width":0.025099734,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_transcriptions","depth":9,"bounds":{"left":0.5738032,"top":0.060654428,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_transcriptions","depth":10,"bounds":{"left":0.57712764,"top":0.06464485,"width":0.04654255,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_transcriptions_fts (v)","depth":9,"bounds":{"left":0.5738032,"top":0.08339984,"width":0.06200133,"height":0.040702313},"on_screen":true,"help_text":"audio_transcriptions_fts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_transcriptions_fts","depth":10,"bounds":{"left":0.57712764,"top":0.08739027,"width":0.055352394,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(v)","depth":11,"bounds":{"left":0.57712764,"top":0.103751,"width":0.004986702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_transcriptions_...","depth":9,"bounds":{"left":0.5738032,"top":0.12410215,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"audio_transcriptions_fts_config","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_transcriptions_...","depth":10,"bounds":{"left":0.57712764,"top":0.12809257,"width":0.053523935,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_transcriptions_...","depth":9,"bounds":{"left":0.5738032,"top":0.14684756,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"audio_transcriptions_fts_data","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_transcriptions_...","depth":10,"bounds":{"left":0.57712764,"top":0.15083799,"width":0.053523935,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_transcriptions_...","depth":9,"bounds":{"left":0.5738032,"top":0.16959298,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"audio_transcriptions_fts_idx","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_transcriptions_...","depth":10,"bounds":{"left":0.57712764,"top":0.1735834,"width":0.053523935,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"elements","depth":9,"bounds":{"left":0.5738032,"top":0.19233839,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"elements","depth":10,"bounds":{"left":0.57712764,"top":0.1963288,"width":0.020777926,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"elements_fts (v)","depth":9,"bounds":{"left":0.5738032,"top":0.2150838,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"elements_fts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"elements_fts","depth":10,"bounds":{"left":0.57712764,"top":0.21907422,"width":0.030917553,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(v)","depth":11,"bounds":{"left":0.6080452,"top":0.21747805,"width":0.004986702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"elements_fts_config","depth":9,"bounds":{"left":0.5738032,"top":0.23782921,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"elements_fts_config","depth":10,"bounds":{"left":0.57712764,"top":0.24181964,"width":0.04637633,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"elements_fts_data","depth":9,"bounds":{"left":0.5738032,"top":0.2605746,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"elements_fts_data","depth":10,"bounds":{"left":0.57712764,"top":0.26456505,"width":0.042220745,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"elements_fts_idx","depth":9,"bounds":{"left":0.5738032,"top":0.28332004,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"elements_fts_idx","depth":10,"bounds":{"left":0.57712764,"top":0.28731045,"width":0.0390625,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"frames","depth":9,"bounds":{"left":0.5738032,"top":0.30606544,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"frames","depth":10,"bounds":{"left":0.57712764,"top":0.31005585,"width":0.015791224,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"frames_fts (v)","depth":9,"bounds":{"left":0.5738032,"top":0.32881084,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"frames_fts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"frames_fts","depth":10,"bounds":{"left":0.57712764,"top":0.33280128,"width":0.025930852,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(v)","depth":11,"bounds":{"left":0.6030585,"top":0.3312051,"width":0.004986702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"frames_fts_config","depth":9,"bounds":{"left":0.5738032,"top":0.35155627,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"frames_fts_config","depth":10,"bounds":{"left":0.57712764,"top":0.35554668,"width":0.04138963,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"frames_fts_data","depth":9,"bounds":{"left":0.5738032,"top":0.37430167,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"frames_fts_data","depth":10,"bounds":{"left":0.57712764,"top":0.3782921,"width":0.03723404,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"frames_fts_idx","depth":9,"bounds":{"left":0.5738032,"top":0.39704707,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"frames_fts_idx","depth":10,"bounds":{"left":0.57712764,"top":0.4010375,"width":0.033909574,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"meetings","depth":9,"bounds":{"left":0.5738032,"top":0.4197925,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"meetings","depth":10,"bounds":{"left":0.57712764,"top":0.4237829,"width":0.020944148,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"memories","depth":9,"bounds":{"left":0.5738032,"top":0.4425379,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"memories","depth":10,"bounds":{"left":0.57712764,"top":0.44652835,"width":0.02244016,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"memories_fts (v)","depth":9,"bounds":{"left":0.5738032,"top":0.46528333,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"memories_fts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"memories_fts","depth":10,"bounds":{"left":0.57712764,"top":0.46927375,"width":0.032579787,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(v)","depth":11,"bounds":{"left":0.6097075,"top":0.46767756,"width":0.004986702,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"memories_fts_config","depth":9,"bounds":{"left":0.5738032,"top":0.48802873,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"memories_fts_config","depth":10,"bounds":{"left":0.57712764,"top":0.49201915,"width":0.048038565,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"memories_fts_data","depth":9,"bounds":{"left":0.5738032,"top":0.51077414,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"memories_fts_data","depth":10,"bounds":{"left":0.57712764,"top":0.51476455,"width":0.043882977,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"memories_fts_idx","depth":9,"bounds":{"left":0.5738032,"top":0.53351957,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"memories_fts_idx","depth":10,"bounds":{"left":0.57712764,"top":0.53751,"width":0.04055851,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ocr_text","depth":9,"bounds":{"left":0.5738032,"top":0.55626494,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ocr_text","depth":10,"bounds":{"left":0.57712764,"top":0.5602554,"width":0.018783245,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"pipe_executions","depth":9,"bounds":{"left":0.5738032,"top":0.57901037,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipe_executions","depth":10,"bounds":{"left":0.57712764,"top":0.5830008,"width":0.036901597,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"pipe_scheduler_state","depth":9,"bounds":{"left":0.5738032,"top":0.6017558,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipe_scheduler_state","depth":10,"bounds":{"left":0.57712764,"top":0.6057462,"width":0.049035903,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"secrets","depth":9,"bounds":{"left":0.5738032,"top":0.62450117,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"secrets","depth":10,"bounds":{"left":0.57712764,"top":0.62849164,"width":0.016788565,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"speaker_embeddings","depth":9,"bounds":{"left":0.5738032,"top":0.6472466,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"speaker_embeddings","depth":10,"bounds":{"left":0.57712764,"top":0.651237,"width":0.04886968,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"speakers","depth":9,"bounds":{"left":0.5738032,"top":0.669992,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"speakers","depth":10,"bounds":{"left":0.57712764,"top":0.67398244,"width":0.020611702,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"sqlite_sequence","depth":9,"bounds":{"left":0.5738032,"top":0.6927374,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sqlite_sequence","depth":10,"bounds":{"left":0.57712764,"top":0.6967279,"width":0.03723404,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"sqlite_stat1","depth":9,"bounds":{"left":0.5738032,"top":0.71548283,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sqlite_stat1","depth":10,"bounds":{"left":0.57712764,"top":0.71947324,"width":0.025930852,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"sqlite_stat4","depth":9,"bounds":{"left":0.5738032,"top":0.73822826,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"sqlite_stat4","depth":10,"bounds":{"left":0.57712764,"top":0.7422187,"width":0.026595745,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tags","depth":9,"bounds":{"left":0.5738032,"top":0.7609737,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tags","depth":10,"bounds":{"left":0.57712764,"top":0.7649641,"width":0.009973404,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ui_events","depth":9,"bounds":{"left":0.5738032,"top":0.78371906,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ui_events","depth":10,"bounds":{"left":0.57712764,"top":0.7877095,"width":0.021775266,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ui_events_fts (v)","depth":9,"bounds":{"left":0.5738032,"top":0.8064645,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"ui_events_fts","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ui_events_fts","depth":10,"bounds":{"left":0.57712764,"top":0.8104549,"width":0.031914894,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(v)","depth":11,"bounds":{"left":0.6090425,"top":0.80885875,"width":0.0048204786,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ui_events_fts_config","depth":9,"bounds":{"left":0.5738032,"top":0.8292099,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ui_events_fts_config","depth":10,"bounds":{"left":0.57712764,"top":0.83320034,"width":0.04737367,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ui_events_fts_data","depth":9,"bounds":{"left":0.5738032,"top":0.8519553,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ui_events_fts_data","depth":10,"bounds":{"left":0.57712764,"top":0.8559457,"width":0.043218084,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ui_events_fts_idx","depth":9,"bounds":{"left":0.5738032,"top":0.8747007,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ui_events_fts_idx","depth":10,"bounds":{"left":0.57712764,"top":0.87869114,"width":0.039893616,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"video_chunks","depth":9,"bounds":{"left":0.5738032,"top":0.89744616,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"video_chunks","depth":10,"bounds":{"left":0.57712764,"top":0.90143657,"width":0.03125,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"vision_tags","depth":9,"bounds":{"left":0.5738032,"top":0.9201915,"width":0.06200133,"height":0.022745412},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"vision_tags","depth":10,"bounds":{"left":0.57712764,"top":0.92418194,"width":0.025930852,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Toggle helper tables","depth":8,"bounds":{"left":0.5738032,"top":0.9708699,"width":0.04637633,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Toggle helper tables","depth":9,"bounds":{"left":0.5738032,"top":0.9708699,"width":0.04637633,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Structure","depth":9,"bounds":{"left":0.6456117,"top":0.0,"width":0.03274601,"height":0.032322425},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Structure","depth":10,"bounds":{"left":0.6512633,"top":0.0,"width":0.02144282,"height":0.014764565},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Content","depth":9,"bounds":{"left":0.6783577,"top":0.0,"width":0.029421542,"height":0.032322425},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Content","depth":10,"bounds":{"left":0.6840093,"top":0.0,"width":0.018118352,"height":0.014764565},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Query","depth":9,"bounds":{"left":0.7077792,"top":0.0,"width":0.025265958,"height":0.032322425},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Query","depth":10,"bounds":{"left":0.7134308,"top":0.0,"width":0.013962766,"height":0.014764565},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Export","depth":9,"bounds":{"left":0.7330452,"top":0.0,"width":0.026097074,"height":0.032322425},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Export","depth":10,"bounds":{"left":0.7386968,"top":0.0,"width":0.014793883,"height":0.014764565},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_chunk_id","depth":10,"bounds":{"left":0.64727396,"top":0.018355945,"width":0.034574468,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_chunk_id","depth":11,"bounds":{"left":0.64727396,"top":0.018355945,"width":0.034574468,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tag_id","depth":10,"bounds":{"left":0.88763297,"top":0.018355945,"width":0.013962766,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tag_id","depth":11,"bounds":{"left":0.88763297,"top":0.018355945,"width":0.013962766,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"audio_chunk_id","depth":10,"bounds":{"left":0.64727396,"top":0.018355945,"width":0.034574468,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"audio_chunk_id","depth":11,"bounds":{"left":0.64727396,"top":0.018355945,"width":0.034574468,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"tag_id","depth":10,"bounds":{"left":0.88763297,"top":0.018355945,"width":0.013962766,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"tag_id","depth":11,"bounds":{"left":0.88763297,"top":0.018355945,"width":0.013962766,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"«","depth":10,"bounds":{"left":0.6456117,"top":0.04668795,"width":0.011801862,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"«","depth":11,"bounds":{"left":0.6499335,"top":0.054269753,"width":0.0031582448,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"‹","depth":10,"bounds":{"left":0.6584109,"top":0.04668795,"width":0.010804521,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"‹","depth":11,"bounds":{"left":0.6627327,"top":0.054269753,"width":0.0021609042,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Page 1 / 1","depth":11,"bounds":{"left":0.67453456,"top":0.054269753,"width":0.021110373,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"›","depth":10,"bounds":{"left":0.7009641,"top":0.04668795,"width":0.010804521,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"›","depth":11,"bounds":{"left":0.7052859,"top":0.054269753,"width":0.0021609042,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"»","depth":10,"bounds":{"left":0.71276593,"top":0.04668795,"width":0.011801862,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"»","depth":11,"bounds":{"left":0.71708775,"top":0.054269753,"width":0.0031582448,"height":0.014764565},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"SQLite database browser","depth":9,"bounds":{"left":0.6456117,"top":0.10574621,"width":0.05236037,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"v0.7.2","depth":9,"bounds":{"left":0.69797206,"top":0.10574621,"width":0.011801862,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", powered by","depth":9,"bounds":{"left":0.70977396,"top":0.10574621,"width":0.027260639,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Flask","depth":9,"bounds":{"left":0.73703456,"top":0.10574621,"width":0.010638298,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Flask","depth":10,"bounds":{"left":0.73703456,"top":0.10574621,"width":0.010638298,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":9,"bounds":{"left":0.74767286,"top":0.10574621,"width":0.009973404,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Peewee","depth":9,"bounds":{"left":0.75764626,"top":0.10574621,"width":0.015791224,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Peewee","depth":10,"bounds":{"left":0.75764626,"top":0.10574621,"width":0.015791224,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":". © 2026","depth":9,"bounds":{"left":0.7734375,"top":0.10574621,"width":0.019614361,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Charles Leifer","depth":9,"bounds":{"left":0.79305184,"top":0.10574621,"width":0.028091755,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Charles Leifer","depth":10,"bounds":{"left":0.79305184,"top":0.10574621,"width":0.028091755,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"sqlite.screenpipe.lakylak.xyz/speaker_embeddings/","depth":5,"bounds":{"left":0.57014626,"top":0.9876297,"width":0.089428194,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-5897645642557941040
|
4561192159602396155
|
visual_change
|
accessibility
|
NULL
|
New Tab
New Tab
Screenpipe — Archive
Screenpipe — New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
All docs · AFFiNE
All docs · AFFiNE
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
SQLite Web: archive.db
SQLite Web: archive.db
SQLite Web: db.sqlite
SQLite Web: db.sqlite
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
sqlite-web 0.7.2
sqlite-web 0.7.2
db.sqlite
db.sqlite
audio_tags
0 rows, showing page 1
Query
Query
table name...
_sqlx_migrations
_sqlx_migrations
audio_chunks
audio_chunks
audio_tags
audio_tags
audio_transcriptions
audio_transcriptions
audio_transcriptions_fts (v)
audio_transcriptions_fts
(v)
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
audio_transcriptions_...
elements
elements
elements_fts (v)
elements_fts
(v)
elements_fts_config
elements_fts_config
elements_fts_data
elements_fts_data
elements_fts_idx
elements_fts_idx
frames
frames
frames_fts (v)
frames_fts
(v)
frames_fts_config
frames_fts_config
frames_fts_data
frames_fts_data
frames_fts_idx
frames_fts_idx
meetings
meetings
memories
memories
memories_fts (v)
memories_fts
(v)
memories_fts_config
memories_fts_config
memories_fts_data
memories_fts_data
memories_fts_idx
memories_fts_idx
ocr_text
ocr_text
pipe_executions
pipe_executions
pipe_scheduler_state
pipe_scheduler_state
secrets
secrets
speaker_embeddings
speaker_embeddings
speakers
speakers
sqlite_sequence
sqlite_sequence
sqlite_stat1
sqlite_stat1
sqlite_stat4
sqlite_stat4
tags
tags
ui_events
ui_events
ui_events_fts (v)
ui_events_fts
(v)
ui_events_fts_config
ui_events_fts_config
ui_events_fts_data
ui_events_fts_data
ui_events_fts_idx
ui_events_fts_idx
video_chunks
video_chunks
vision_tags
vision_tags
Toggle helper tables
Toggle helper tables
Structure
Structure
Content
Content
Query
Query
Export
Export
audio_chunk_id
audio_chunk_id
tag_id
tag_id
audio_chunk_id
audio_chunk_id
tag_id
tag_id
«
«
‹
‹
Page 1 / 1
›
›
»
»
SQLite database browser
v0.7.2
, powered by
Flask
Flask
and
Peewee
Peewee
. © 2026
Charles Leifer
Charles Leifer
sqlite.screenpipe.lakylak.xyz/speaker_embeddings/...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
21754
|
949
|
41
|
2026-05-11T18:21:13.426678+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778523673426_m2.jpg...
|
Finder
|
.screenpipe
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
db.sqlite-wal
Today at 21:20
16,5 MB
Document
screenpipe.2026-05-11.0.log
Today at 21:20
507 KB
Log File
data
Today at 21:20
1,39 GB
Folder
MacBook Pro Microphone (input)_2026-05-11_18-20-22.mp4...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Favourites","depth":6,"bounds":{"left":0.5046542,"top":0.061452515,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"jiminny","depth":6,"bounds":{"left":0.51263297,"top":0.08140463,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AirDrop","depth":6,"bounds":{"left":0.51263297,"top":0.103751,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Recents","depth":6,"bounds":{"left":0.51263297,"top":0.12609737,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Applications","depth":6,"bounds":{"left":0.51263297,"top":0.14844373,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Documents","depth":6,"bounds":{"left":0.51263297,"top":0.1707901,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Downloads","depth":6,"bounds":{"left":0.51263297,"top":0.19313647,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"lukas","depth":6,"bounds":{"left":0.51263297,"top":0.21548285,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"iCloud","depth":6,"bounds":{"left":0.5046542,"top":0.2434158,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"iCloud Drive","depth":6,"bounds":{"left":0.51263297,"top":0.26336792,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sync folder","depth":6,"bounds":{"left":0.51263297,"top":0.2857143,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Locations","depth":6,"bounds":{"left":0.5046542,"top":0.31364724,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"DXP4800PLUS-B5F","depth":6,"bounds":{"left":0.51263297,"top":0.33359936,"width":0.043218084,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Eject","depth":6,"bounds":{"left":0.55651593,"top":0.33519554,"width":0.0043218085,"height":0.009577015},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false},{"role":"AXStaticText","text":"Network","depth":6,"bounds":{"left":0.51263297,"top":0.35594574,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Tags","depth":6,"bounds":{"left":0.5046542,"top":0.38387868,"width":0.06216755,"height":0.015163607},"on_screen":true,"automation_id":"xSidebarHeader","role_description":"text"},{"role":"AXStaticText","text":"CRM","depth":6,"bounds":{"left":0.51263297,"top":0.4038308,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Orange","depth":6,"bounds":{"left":0.51263297,"top":0.42617717,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Red","depth":6,"bounds":{"left":0.51263297,"top":0.44852355,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Yellow","depth":6,"bounds":{"left":0.51263297,"top":0.4708699,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Green","depth":6,"bounds":{"left":0.51263297,"top":0.49321628,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Blue","depth":6,"bounds":{"left":0.51263297,"top":0.51556265,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Purple","depth":6,"bounds":{"left":0.51263297,"top":0.53790903,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"All Tags…","depth":6,"bounds":{"left":0.51263297,"top":0.5602554,"width":0.049534574,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextField","text":"db.sqlite-wal","depth":7,"on_screen":false,"value":"db.sqlite-wal","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 21:20","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"16,5 MB","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Document","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXTextField","text":"screenpipe.2026-05-11.0.log","depth":7,"on_screen":false,"value":"screenpipe.2026-05-11.0.log","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 21:20","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"507 KB","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Log File","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXTextField","text":"data","depth":7,"on_screen":false,"value":"data","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Today at 21:20","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"1,39 GB","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXTextField","text":"MacBook Pro Microphone (input)_2026-05-11_18-20-22.mp4","depth":7,"on_screen":false,"value":"MacBook Pro Microphone (input)_2026-05-11_18-20-22.mp4","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-8349690942431013676
|
-840440566428093711
|
visual_change
|
accessibility
|
NULL
|
Favourites
jiminny
AirDrop
Recents
Applications
Do Favourites
jiminny
AirDrop
Recents
Applications
Documents
Downloads
lukas
iCloud
iCloud Drive
Sync folder
Locations
DXP4800PLUS-B5F
Eject
Network
Tags
CRM
Orange
Red
Yellow
Green
Blue
Purple
All Tags…
db.sqlite-wal
Today at 21:20
16,5 MB
Document
screenpipe.2026-05-11.0.log
Today at 21:20
507 KB
Log File
data
Today at 21:20
1,39 GB
Folder
MacBook Pro Microphone (input)_2026-05-11_18-20-22.mp4...
|
21753
|
NULL
|
NULL
|
NULL
|
|
22051
|
962
|
41
|
2026-05-12T06:46:38.564215+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778568398564_m1.jpg...
|
Firefox
|
[JY-20725] [HubSpot] Optimise CRM rematching on de [JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira — Work...
|
True
|
jiminny.atlassian.net/browse/JY-20725?actionerId=7 jiminny.atlassian.net/browse/JY-20725?actionerId=712020%3Ae67fb6e1-5298-44c2-9101-05d96c6e3768&sourceType=assign...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Jy 20820 es reindex stream model hydration by Vasi Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
github.com
New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Close tab
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
Close tab
SevenShores\Hubspot\Exceptions\BadRequest: 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
SevenShores\Hubspot\Exceptions\BadRequest: 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
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"github.com","depth":4,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SevenShores\\Hubspot\\Exceptions\\BadRequest: 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","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
4710837805992655384
|
-2912409957734174078
|
visual_change
|
accessibility
|
NULL
|
Jy 20820 es reindex stream model hydration by Vasi Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
github.com
New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Close tab
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
Close tab
SevenShores\Hubspot\Exceptions\BadRequest: 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
SevenShores\Hubspot\Exceptions\BadRequest: 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
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
22138
|
964
|
41
|
2026-05-12T06:50:28.019974+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778568628019_m1.jpg...
|
Firefox
|
JY-20361: Add call scores in Panorama by steliyan- JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet — Work...
|
True
|
github.com/jiminny/prophet/pull/507/changes
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelplolnmeet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.comNikolay Yankov (Presenting, annotating)ChromeViewHistoryProfilesTabWindowHelp*1 SeX PrhnryAt:JinС мсJir8 Jirlhttps://jiminny.atlassian.net/jira/software/c/projects/JY/boards/3788© AWS|X) SSH• Home | Salesforce |DatadogPlatform TeamQ Sear$ Jу-16322 | JY-18091|READY FLUpgrade to PHP 8.5DescriptionBranchInitial ReleaseActive Support UntilSecurity Support Until8.323 Nov 2023|31 Dec 202531 Dec 2027S8421 Nov 202431 Dec 202631 Dec 20288,520 Nov 202531 Dec 202731 Dec 2029Currenty the Jiminny app is on PHP 8.3 which is 2 versions behind the latest one. It is already stable as was released coupleof months ago, so please proceed with an update.Here are Migration Guides:• ₴ PHP: Migrating from PHP 8.3.x to PHP 8.4.x - Manual• PHP: Migrating from PHP 8.4.x to PHP 8.5.x - Manualот1SubtasksAdd subtask8 мс3 CircleciA SentryIn Dev v* Improve Technical Story~ DetailsAssigneeNikolay IvanovAssign to meReporter3 Martin PetkovDevelopment|@ Open with VS Code2 branches11 commits1 pull request1 buildComponentsPlatformSub-ProductDaily - Platform • now100% <2Tue 12 May 9:50:27=8• Tue 12 May 9:501[л|+D All Bookmarks |Nikolay NikolovNikolay Ivanov4 othersNikolay Yankovt.meet.google.comNikolay Yankov (You, presenti..+7Lukas Kovalik4:34Lộ39:50 AM | Daily - Platform...
|
NULL
|
1182806102362234352
|
NULL
|
click
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryBookmarksProfilesToolsWi FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelplolnmeet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.comNikolay Yankov (Presenting, annotating)ChromeViewHistoryProfilesTabWindowHelp*1 SeX PrhnryAt:JinС мсJir8 Jirlhttps://jiminny.atlassian.net/jira/software/c/projects/JY/boards/3788© AWS|X) SSH• Home | Salesforce |DatadogPlatform TeamQ Sear$ Jу-16322 | JY-18091|READY FLUpgrade to PHP 8.5DescriptionBranchInitial ReleaseActive Support UntilSecurity Support Until8.323 Nov 2023|31 Dec 202531 Dec 2027S8421 Nov 202431 Dec 202631 Dec 20288,520 Nov 202531 Dec 202731 Dec 2029Currenty the Jiminny app is on PHP 8.3 which is 2 versions behind the latest one. It is already stable as was released coupleof months ago, so please proceed with an update.Here are Migration Guides:• ₴ PHP: Migrating from PHP 8.3.x to PHP 8.4.x - Manual• PHP: Migrating from PHP 8.4.x to PHP 8.5.x - Manualот1SubtasksAdd subtask8 мс3 CircleciA SentryIn Dev v* Improve Technical Story~ DetailsAssigneeNikolay IvanovAssign to meReporter3 Martin PetkovDevelopment|@ Open with VS Code2 branches11 commits1 pull request1 buildComponentsPlatformSub-ProductDaily - Platform • now100% <2Tue 12 May 9:50:27=8• Tue 12 May 9:501[л|+D All Bookmarks |Nikolay NikolovNikolay Ivanov4 othersNikolay Yankovt.meet.google.comNikolay Yankov (You, presenti..+7Lukas Kovalik4:34Lộ39:50 AM | Daily - Platform...
|
22135
|
NULL
|
NULL
|
NULL
|
|
22171
|
965
|
41
|
2026-05-12T06:52:22.916789+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778568742916_m2.jpg...
|
Firefox
|
JY-20361: Add call scores in Panorama by steliyan- JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet — Work...
|
True
|
github.com/jiminny/prophet/pull/507/changes
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.24335106,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.25664893,"top":0.06304868,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"bounds":{"left":0.24335106,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"bounds":{"left":0.25664893,"top":0.09577015,"width":0.16888298,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-6974384680968731466
|
-4533951291672776118
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
22238
|
966
|
41
|
2026-05-12T06:57:03.803662+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778569023803_m1.jpg...
|
Firefox
|
LLM pricing overview with the most actual prices - LLM pricing overview with the most actual prices - Google Search — Work...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-5568038424350801835
|
-3092820299487792498
|
visual_change
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
22323
|
968
|
41
|
2026-05-12T07:01:32.184077+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778569292184_m1.jpg...
|
Firefox
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira — Work...
|
True
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37?selectedIssue=JY-20361...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
833750947031680794
|
-3380775110537793376
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app...
|
22321
|
NULL
|
NULL
|
NULL
|
|
22450
|
970
|
41
|
2026-05-12T07:07:00.467821+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778569620467_m1.jpg...
|
Firefox
|
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/12036/changes
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-2219013471096925094
|
-4245720915524734258
|
visual_change
|
hybrid
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Firefox(nhlSupport Daily • in 4 h 54 ml8• Tue 12 May 10:07:00FileEditViewHistoryBookmarksProfilesToolsWindowHelpmeet.google.com/mie-gawc-dsi?authuser=lukas.kovalik%40jiminny.comNikolay Yankov (Presenting, annotating)ChromeFileViewHistory19 SeProfilesTabWindowHelpJirPr+ AtAtiAt:*Jin* ChС м3 мс8 Jielhttps://jiminny.atlassian.net/jira/software/c/projects/JY/boards/37X) SSHnanne oaielorePlatform TeamQ Search boardEpic vType vQuick filters vREADY FOR DEVIN DEV 3CODE REVIEW 2BLOCKEDUpgrade to PHP 8.5PHP 8,5 UPGRADEIn Dev3 1 •••=AJ Panorama forCall Scoring ….AUTOMATED AI SCORINGCode Review2.5 1 =E JY-18091|[ JY-20361|•SAI Review - Q1 -Summary/Actionitems/Key PointsGROWTH - MAINTAIN OU...In Dev20.000=• *[ JY-20566|[HubSpot] OptimiseCRM rematching ondelete hubspot…PLATFORM STABILITYCode Review4 h =X* JY-20725[POC]Jiminny MCPConnectorJIMINNY MCP CONNECTORIn Progress10 1 [PASSWORD_DOTS]=@ JY-206258• Tue 12 May 10:07ais|+DatadogMiCiuC All BookmarksComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 10Smart Instant|Nudge Pre-filteringCOST-EFFECTIVE AND FA...Ready for QA|15 П =Al Reports > Emptypage design andpromotionAJ REPORTSDeployed1 1 [PASSWORD_DOTS]=[ JY-20493|Д JY-20372Sync opportunitieswithout a localowner (user_id is…..PLATFORM STABILITYDeployed5 1 =9JY-20352meet.googe.orga Nikolay Yankov (You, presenti...+7Grok via AzureMAINTENANCEDeployed0000-A JY-20726Allow users todelete SS andPanorama prompt...Aneliya AngelovaStefka StoyanovaLukas Kovalik9Galya Dimitrova4 others10:06 AM | Daily - Platform21:07D111...
|
22449
|
NULL
|
NULL
|
NULL
|