Company Skill
This skill helps you understand, debug, and navigate the company-related code across the Datalayer platform. It covers lambda functions, API endpoints, data models, creation flows, target accounts, company identifiers, centralized companies, client UI, and debugging guidance.
Invocation
When the user asks about companies, use this knowledge base to:
- •Identify which lambdas and files are relevant to their question
- •Explain the end-to-end company creation, enrichment, and reveal flow
- •Explain target accounts, company identifiers, and centralized company features
- •Help debug company-related issues by pointing to the right logs, tables, and code
Repositories
| Repository | Path | Role |
|---|---|---|
| datalayerapp-v2-function-code | D:\Projects\Datalayer\datalayerapp-v2-function-code | AWS Lambda functions for company processing |
| datalayerapp-v2 | D:\Projects\Datalayer\datalayerapp-v2 | Main Express.js application (API endpoints, models, analytics, client UI) |
| llservices-salesforce | D:\Projects\Datalayer\llservices-salesforce | Salesforce sync service (CompanyJobs queue processing) |
What Are Companies?
Companies represent B2B organizations identified through website visitor IP/domain resolution. The system:
- •Detects visitor IP/domain against company databases (KickFire, TheCompaniesAPI)
- •Identifies which B2B organizations are browsing your website
- •Enriches with business intelligence (employees, revenue, industry, location, social links)
- •Tracks company engagement metrics across all visitor sessions
- •Enables B2B targeting and account-based marketing via Target Accounts
Company Data Sources
Companies enter the system through three channels, tracked via dataSources:
| Source | Constant | Description |
|---|---|---|
| Revealed | REVEALED | Automatically detected from website visitor IP/domain resolution |
| Provided | PROVIDED | Submitted via API by external systems |
| Imported | IMPORTED | Bulk imported via HandleImportBulkCompanies |
Lambda Functions (datalayerapp-v2-function-code)
1. HandleImportBulkCompanies
- •Path:
lambda-functions/HandleImportBulkCompanies/ - •Handler:
index.mjs - •Purpose: Entry point for bulk company imports
- •What it does:
- •Receives a Redis key containing a domain list and metadata
- •Parses and deduplicates domains, filters out personal email domains
- •Checks if domains already exist in DynamoDB (DOMAIN_COMPANY table) or Salesforce DB (CompanyJobs table)
- •Creates CompanyJob records in Salesforce DB with status
WAITING
- •Key files:
models/db_sf_handler.mjs,models/dynamo_handler.mjs - •Triggered by: API call / manual import
2. HandleThreadCreateCompanies
- •Path:
lambda-functions/HandleThreadCreateCompanies/ - •Handler:
index.mjs - •Purpose: Processes waiting CompanyJobs in batches
- •What it does:
- •Queries Salesforce DB for CompanyJobs with status
WAITING(limit 500, older than 30 min) - •Extracts domain from each job
- •Sends SQS message per domain to
HANDLE_REVEALED_COMPANIES_QUEUE - •Updates job status to
DONE - •If exactly 500 jobs processed, sends SQS to itself for pagination
- •Queries Salesforce DB for CompanyJobs with status
- •Key files:
models/db_sf_handler.mjs,utils/sqs.mjs - •Triggered by: Scheduled event / SQS (self-invocation for pagination)
3. Handle_RevealedCompanies
- •Path:
lambda-functions/Handle_RevealedCompanies/ - •Handler:
index.js - •Purpose: Core company revelation and enrichment engine
- •What it does:
- •Account check: Verifies reveal feature is enabled, checks quota
- •Data prefetch: Batch gets visitors, IP/domain mappings, existing companies from DynamoDB
- •Deduplication: Pre-processes unique IPs/domains across all payloads
- •External API calls:
- •Kickfire API v3:
https://api.kickfire.com/v3/company:(all)?website={domain}&key={apiKey} - •TheCompaniesAPI:
https://api.thecompaniesapi.com/v1/companies/{domain}?token={token}
- •Kickfire API v3:
- •Data transformation: UUID v5 generation, NAICS code mapping, org type classification
- •Atomic quota reservation: DynamoDB conditional update on AccountStatistics
- •Batch storage: Writes to Company, AccountCompany, IP-Company, Domain-Company tables
- •SQS dispatch: Sends to BigQuery queue, enrichment queue, and merge data queue
- •Key files:
- •
services/companyDataService.js- External API integration with rate limiting - •
processors/companyBatchProcessor.js- Batch deduplication across payloads - •
processors/payloadProcessor.js- Core business logic per payload - •
services/visitorSyncService.js- Visitor/session updates - •
services/storageService.js- DynamoDB batch operations, SQS batching - •
models/dynamoHandler.js- DynamoDB operations including atomic quota reservation - •
models/dbHandler.js- PostgreSQL operations (account/package data) - •
constants/index.js- 442+ personal domains, rate limits, source types - •
constants/naics.js- NAICS industry classification - •
constants/blacklist.js- ISP/mobile blacklist
- •
- •Triggered by: SQS (HANDLE_REVEALED_COMPANIES_QUEUE)
4. HandleCheckDomainCompany
- •Path:
lambda-functions/HandleCheckDomainCompany/ - •Handler:
index.js - •Purpose: On-demand domain-based company lookup
- •What it does:
- •Checks if domain exists in DynamoDB company table
- •If not found, calls Kickfire/TheCompaniesAPI
- •Stores new company record and domain mapping
- •Logs the API request for quota tracking
- •Key files:
models/index.js,utils/index.js - •Triggered by: API Gateway / direct invocation
5. HandleAddMoreDataToTheCompany
- •Path:
lambda-functions/HandleAddMoreDataToTheCompany/ - •Handler:
index.js - •Purpose: Extended company data enrichment
- •What it does:
- •Batch gets companies from DynamoDB by companyId
- •Calls TheCompaniesAPI for extended data (concurrent limit: 50)
- •Merges extended data (employee ranges, revenue, etc.) with existing records
- •Batch updates companies in DynamoDB
- •Fetches AccountCompany records and sends to BigQuery queue
- •Key files:
models/dynamoHandler.js,helpers.js - •Triggered by: SQS (HANDLE_ADD_MORE_DATA_TO_THE_COMPANY_QUEUE)
6. HandleCompanyBigQuery
- •Path:
lambda-functions/HandleCompanyBigQuery/ - •Handler:
index.js - •Purpose: Sync company data to BigQuery via S3
- •What it does:
- •Parses SQS messages:
{ accountId, companyId } - •Gets companies and account-company records from DynamoDB
- •Gets accounts from PostgreSQL (timezone info)
- •Gets intent property values from PostgreSQL
- •Deduplicates (keeps latest by sentTimestamp)
- •Maps data using
getMappingData()into BigQuery schema - •Uploads JSON records to S3:
s3://bucket/accountId_{id}/YYYY-MM-DD-HH/Companies/
- •Parses SQS messages:
- •Key files:
models/db_handler.js,models/dynamo_handler.js,s3/ - •Triggered by: SQS (HANDLE_COMPANIES_BIGQUERY_QUEUE)
API Endpoints (datalayerapp-v2)
Company Identifier
- •
GET /admin/company-identifier/:accountId- List company identifiers (paginated, filterable by value/type/source/status/enrichment) - •
GET /admin/company-identifier/retrieve/:id- Retrieve single company identifier - •Files:
server/routes/companyIdentifier.js,server/controllers/companyIdentifier.js,server/services/companyIdentifier.js,server/models/companyIdentifier.js
Company Match
- •
POST /admin/company-matches- Get all company match data (global) - •
POST /admin/contract-plan/company-matches- Get company matches by contract plan - •
POST /admin/account/company-matches- Get company matches for specific account - •Files:
server/routes/companyMatch.js,server/controllers/companyMatch.js,server/services/companyMatch.js
Match Statistics Tracked:
- •Match types: ipData, domainData, ipLookup, domainLookup
- •API calls: KickFire, IP, Domain
- •Provider/Company presence, noMatch counts
- •Confidence ranges: 0-25, 26-50, 51-75, 76-85, 86-95
Centralized Company (Admin)
- •
GET /admin/centralized-company/:accountId- List centralized companies (filterable by name/domain/status/quality scores) - •
GET /admin/centralized-company/retrieve/:id- Retrieve single centralized company with account info - •
POST /admin/centralized-company- Find centralized company by account context - •Files:
server/routes/centralizedCompany.js,server/controllers/centralizedCompany.js,server/services/centralizedCompany.js,server/models/centralizedCompany.js
Record Profile
- •
POST /client/record-profile/company- Get full enriched company profile with metrics - •Returns: Company data, lifetime metrics (sessions, users, people, conversions, page views), engagement scores, source attribution
Account Company Management
- •
PUT /admin/account/update-revealed-company- Enable/disable revealed companies per account, set monthly quota - •
PUT /client/account/companyStatus- Toggle company status (ON/OFF)
Target Account Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /client/target-account/create-table-bigquery | Create BigQuery table for target accounts |
| POST | /client/target-account/get-list-domain | Get domain list for account |
| POST | /client/target-account/import | Import target accounts |
| POST | /client/target-account/check-import-domain | Validate import data |
| POST | /client/target-account/full-list | Retrieve all target accounts (paginated) |
| PUT | /client/target-account | Update target accounts |
| DELETE | /client/target-account | Remove target account |
| GET | /client/target-account/condition-value/:accountId | Get condition values for filtering |
| POST | /client/target-account/find-account | Find companies matching conditions |
Account Group Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /client/account-groups/:accountId | List groups for account |
| GET | /client/account-group/:id | Get specific group with rules |
| POST | /client/account-groups | Create new group |
| PUT | /client/account-groups | Update group |
| DELETE | /client/account-groups | Delete group |
| DELETE | /client/account-group | Remove target account from group |
| POST | /client/account-groups/script-create-default | Create default groups |
- •Files:
server/routes/targetAccount.js,server/controllers/targetAccount.js,server/services/targetAccount.js,server/models/targetAccount.js,server/constants/targetAccount.js
Server-Side Services
Target Account Service
File: server/services/targetAccount.js (1004 lines, 17 exports)
| Function | Purpose |
|---|---|
handleCreateTableTargetAccountBigquery | Create TargetAccounts BigQuery table with time partitioning |
handleUpdateTargetAccount | Process updates, handle group assignments, manage BO status |
handleImportTargetAccount | Bulk import with domain validation, company data enrichment |
handleRemoveTargetAccount | Delete and track in history |
handleGetListDomainByAccount | Query domains with optional group filtering |
handleGetListTargetAccount | Paginated retrieval with complex joins to groups |
handleGetFullValueCompanyInfo | Extract distinct company attributes for filter dropdowns |
handleGetListCompanyFindAccount | Query companies by filter conditions |
handleGetListGroups | List groups per account |
handleGetRuleGroup | Retrieve group with deserialized conditions |
handleCreateDefaultAccountGroups | Generate default "Big Opportunities" group |
handleCreateGroups | Create groups with optional dynamic rules |
handleUpdateGroups | Update group metadata and conditions |
handleRemoveGroups | Delete group and track related accounts |
handleRemoveTargetAccountGroups | Unassign account from group |
scriptCreateDefaultAccountGroups | Batch script for all accounts |
handleAddSectionTargetAccount | Add new fields to BigQuery analytics tables |
Target Account Model
File: server/models/targetAccount.js (1127 lines, 40+ exports)
Key operation groups:
- •Target Account CRUD: createTargetAccount, createMultiTargetAccount, updateTargetAccount, removeTargetAccount
- •Target Account Queries: getListDomainInfo, getCompanyInfo, getCompanyHavingCondition, getFullValueCompanyInfo, findTargetAccountByAccountId
- •Groups CRUD: createGroups, updateGroups, removeGroups, findListGroupByAccountId
- •Group-Account Relations: createTargetAccountGroups, removeTargetAccountGroupsByAccountGroup, getTargetAccountsByGroupId
- •Dynamic Rule Processing: processRuleDynamicAccountGroup, getTargetAccountInGroupDynamic
- •BigQuery Operations: insertDataTargetAccountToBigQuery, updateDataTargetAccountToBigQuery, deleteTargetAccountBigQuery, updateTargetAccountInRevealedCompaniesStats, updateTargetAccountInPeopleStats
Account Service (Company Functions)
File: server/services/account.js
| Function | Purpose |
|---|---|
handleUpdateAccountCompanyStatus | Toggle companyStatus, track in history |
updateAccountRevealedCompany | Set isRevealedCompanies, maxCompanyRequestMonthly, sync with plan |
handleTurnOnRevealedCompanyAccount | Enable revealed companies, set unlimited quota (-1) |
handleUpdateUsingTargetAccount | Toggle usingTargetAccount feature, disable related goals |
handleCheckCompanyContractPlanMonthly | Scheduled job to reset company request counters per billing cycle |
Database Tables
DynamoDB Tables (datalayerapp-v2-function-code)
| Table | Purpose | Key Fields |
|---|---|---|
DYNAMODB_TABLE_COMPANY | Company master records | id (UUID v5), domain, companyName, employees, revenue, sector, industry, confidence |
DYNAMODB_TABLE_IP_COMPANY | IP to company mapping | ip, companyId, createdAt, endTime (45-day TTL) |
DYNAMODB_TABLE_DOMAIN_COMPANY | Domain to company mapping | domain, companyId, createdAt, endTime |
DYNAMODB_TABLE_ACCOUNT_COMPANY | Account-specific company data | id (accountId+companyId), accountId, companyId, dataSources, createdAt, providedAt, revealedAt, importedAt |
DYNAMODB_TABLE_VISITORS | Visitor records with company link | id, personId, lastSessionId, companyId |
DYNAMODB_TABLE_SESSIONS | Session records with company link | id, accountId, visitorId, companyId |
DYNAMODB_TABLE_ACCOUNT_STATISTICS | Quota tracking | accountId, numberOfCompaniesRequestMonthly |
DYNAMODB_TABLE_LOGS_COMPANY_REQUEST | API request logs | id, accountId, domain, isCallApi, confidence, createdAt |
DYNAMODB_TABLE_ERROR_LOG | Error tracking | inputData, error, timestamp |
PostgreSQL Tables (datalayerapp-v2)
| Table | Purpose | Key Fields |
|---|---|---|
CompanyIdentifier | Company identifier metadata | id, accountId, visitorId, sessionId, companyId, type, value, source, status, enrichmentStatus, llmStatus |
TargetAccounts | Target accounts with company mapping | id, accountId, domain, companyId, isBO, isSyncBigQuery, companyData (serialized JSON) |
CentralizedCompany | Centralized company master data | id, accountId, name, domain, status, validDomain, validLinkedin, validPersonMatch, invalidPersonMatch, qualityScore |
AccountGroups | Target account group definitions | id, accountId, name, type (LIST_OF_ACCOUNTS/DYNAMIC_LIST), conditions |
TargetAccountGroups | Many-to-many: accounts to groups | targetAccountId, accountGroupId |
TargetAccounts Migration: server/migrations/20241010091500_tcreate_table_targetAccount.js
Salesforce DB (llservices-salesforce)
| Table | Purpose |
|---|---|
CompanyJobs | Company import job queue (id, accountId, domain, recordId, object, status, turnId, logs) |
BigQuery Query Builders & Schemas
Company Data Query Builders
| File | Purpose |
|---|---|
server/models/query-builders/dashboard/metric-dashboard/companyGroup.js | Company grouping with reveal status |
server/models/query-builders/all-pages/sub-queries/companyData.js | Company data extraction for pages |
server/models/query-builders/acquisition-channels-details/sub-queries/companyData.js | Company data for acquisition |
server/models/query-builders/conversion/all-conversion/sub-queries/companyData.js | Company data for conversions |
server/models/query-builders/event-details/sub-queries/companyData.js | Company data for events |
server/models/query-builders/merge-report-query/sub-queries/companyData.js | Company data for merged reports |
server/models/query-builders/merge-report-query/sub-queries/companyMetrics.js | Company metrics |
Target Account Query Builders
| File | Purpose |
|---|---|
server/models/query-builders/dashboard/metric-dashboard/targetAccount.js | getTargetAccountRevealedQuery, getTargetAccountActiveQuery |
server/models/query-builders/people-details/sub-queries/targetAccountData.js | People with target account domains |
server/models/query-builders/session-details/sub-queries/targetAccountData.js | Session-level target account joins |
server/models/query-builders/user-details/sub-queries/targetAccountData.js | User-level target account joins |
BigQuery Schemas
File: server/constants/bigquery/schemas/companies/companyParent.js
- •Company RECORD schema with
id,name,domain,descriptionShort,socialNetworks(REPEATED RECORD with 13 social platform URLs)
File: server/constants/bigquery/schemas/revealedCompaniesStats/companyTargetAccount.js
- •Target Account columns:
targetAccountID(STRING),isTargetAccount(BOOLEAN),targetAccountTimestampUTC(TIMESTAMP),targetAccountTimestamp(STRING)
Client-Side Architecture
Pages & Components
Company Profile Detail:
- •
client/src/components/cms/subscriber/analytics/record-profile/CompanyDetail.js- •Comprehensive revealed company profile with enriched data
- •Displays: company name, logo, domain, social links, identified date, latest session
- •Lifetime metrics: sessions, engaged sessions, users, people, conversions, page views
- •Accordion sections: Description, Size, Industry/NAICS, Location (with Google Maps), Other Data
- •Related tables: All Pages, Sources, Conversions, People Details, User Details, Session Details
Reveal Companies Settings:
- •
client/src/components/cms/subscriber/sources/reveal/reveal-companies/index.js- •Toggle to enable "Reveal companies in your analytics data"
- •Monthly company matches limit configuration
- •Requires "Reveal" subscription
Target Accounts Management:
- •
client/src/components/cms/subscriber/goals/target-accounts/index.js- Main page with Full List and Account Groups - •
client/src/components/cms/subscriber/goals/target-accounts/find-account/CompanyTableInfo.js- Searchable grid for finding companies - •
client/src/components/cms/subscriber/goals/target-accounts/full-list/table/index.js- Full list management - •
client/src/components/cms/subscriber/goals/target-accounts/account-groups/index.js- Account groups (dynamic lists, list of accounts, big opportunities) - •
client/src/components/cms/subscriber/goals/target-accounts/actions/index.js- Request handlers - •
client/src/components/cms/subscriber/goals/target-accounts/actions/apis.js- API call functions
Admin Components:
- •
client/src/components/cms/admin/centralized-company/index.js- Centralized company database (filterable table) - •
client/src/components/cms/admin/centralized-company/CentralizedCompanyDetails.js- Single company enrichment detail - •
client/src/components/cms/admin/company-matches/CompanyMatchesDetail.js- KickFire API usage stats - •
client/src/components/cms/admin/accounts/AccountRevealCompany.js- Enable/disable reveal per account - •
client/src/components/cms/admin/accounts/EnrichmentRule/retrieve/CompanyIdentifier.js- Company identifier enrichment pipeline status - •
client/src/components/cms/admin/accounts/EnrichmentRule/tabs/CentralizedCompanyPanel.js- Admin panel for centralized company records
Client Routing
Subscriber Routes:
- •
/:secondId/goals/target-accounts- Target Accounts management - •
/:secondId/explore-data/revealed-companies- Revealed Companies report - •
/:secondId/privacy/reveal/revealed-companies- Reveal settings
Admin Routes:
- •
/company-matches- Global company match stats - •
/accounts/company-matches/:accountId- Per-account match stats - •
/contract-plans/company-matches/:packageId- Per-plan match stats - •
/centralized-company- Centralized company list - •
/centralized-company/:id- Centralized company detail
Client API Constants
| Constant | Path | Purpose |
|---|---|---|
API_RECORD_PROFILE_COMPANY | client/record-profile/company | Get enriched company profile |
ADMIN_ACCOUNT_UPDATE_REVEALED_COMPANY | admin/account/update-revealed-company | Enable/disable reveal |
API_UPDATE_ACCOUNT_COMPANY_STATUS | /client/account/companyStatus | Toggle company status |
ADMIN_CENTRALIZED_COMPANY | admin/centralized-company | List centralized companies |
ADMIN_CENTRALIZED_COMPANY_BY_ACCOUNT | admin/centralized-company/:accountId | By account |
ADMIN_COMPANY_IDENTIFIERS_BY_ACCOUNT | admin/company-identifier/:accountId | List identifiers |
ADMIN_CENTRALIZED_COMPANY_RETRIEVE | admin/centralized-company/retrieve/:id | Retrieve single |
ADMIN_COMPANY_IDENTIFIER_RETRIEVE | admin/company-identifier/retrieve/:id | Retrieve identifier |
ADMIN_COMPANY_MATCHES | admin/company-matches | Global match data |
ADMIN_ACCOUNT_COMPANY_MATCHES | admin/account/company-matches | Account match data |
CLIENT_TARGET_ACCOUNT | client/target-account | Target account operations |
Client Constants
Component Names: RECORD_PROFILE_COMPANY, TARGET_ACCOUNTS_FIND_ACCOUNT, ADMIN_COMPANY_IDENTIFIER, ADMIN_CENTRALIZED_COMPANY
Target Account Group Types: DYNAMIC_LIST, LIST_OF_ACCOUNTS, BIG_OPPORTUNITIES
Find Account Company Fields: Domain, Company Name, Revenue, Employees, Industry, Products & Services Tags, Country, State, Business Type, Monthly Visitors, Year Founded
Company Data Mapping (31 fields): companyName, descriptionShort, description, yearFounded, countryData, countryShort, region, regionShort, cityData, city, postal, latitude, longitude, timeZoneId, timeZoneName, employees, totalEmployeesExact, revenue, alexaRank, monthlyVisitors, businessType, stockExchange, stockSymbol, primaryIndustry, industries, naicsCode, naicsSector, naicsSubsector, naicsGroup, naicsDesc, sicCode, sicGroup, socialNetworks
Company Data Structure
{
companyId: string, // UUID v5 (from name + domain)
companyName: string,
domain: string,
logo: string,
identifiedDate: string,
latestSession: string,
// Lifetime Metrics
countSession: number,
countEngaged: number,
countUser: number,
countPeople: number,
countConversions: number,
countPageView: number,
sessionDuration: number,
avgSessionDuration: number,
engagementScore: number,
isTargetAccount: boolean,
// Source Attribution
sourceFirst: object,
sourceLast: object,
sourcePath: array,
dataSources: array, // ['REVEALED', 'PROVIDED', 'IMPORTED']
// Description
descriptionShort: string,
description: string,
// Size/Scale
monthlyVisitors: number,
revenue: string,
stockExchange: string,
stockSymbol: string,
phone: string,
employees: number,
totalEmployeesExact: number,
yearFounded: number,
alexaRank: number,
// Industry
businessType: string,
primaryIndustry: string,
industries: array,
naicsCode: string,
naicsSector: string,
naicsSubsector: string,
naicsGroup: string,
naicsDesc: string,
sicCode: string,
sicGroup: string,
// Location
address: string,
city: string,
county: object,
country: string,
countryShort: string,
state: object,
continent: object,
region: string,
regionShort: string,
postal: string,
latitude: number,
longitude: number,
timeZoneId: string,
timeZoneName: string,
// Other
confidence: number,
tradeName: string,
isISP: boolean,
isWifi: boolean,
isMobile: boolean,
createdAt: timestamp,
updatedAt: timestamp,
// Social Networks
socialNetworks: {
linkedin: string,
linkedinSalesNavigator: string,
facebook: string,
instagram: string,
twitter: string,
youtube: string,
pinterest: string,
angellist: string,
crunchbase: string,
dribbble: string,
github: string
}
}
Target Account Group Types
| Type | Constant | Description |
|---|---|---|
| List of Accounts | LIST_OF_ACCOUNTS | Manual static list of target companies |
| Dynamic List | DYNAMIC_LIST | Rules-based automatic grouping by company attributes |
| Big Opportunities | BIG_OPPORTUNITIES | Default group for high-value opportunities (BO flag) |
Company Enrichment Pipeline
Company Identifier | +-- Validation Stage | - Valid Status (validated/invalid/pending) | - Validation Run timestamp | - Validation Data (details) | +-- Enrichment Stage | - Enrich Status (enriched/failed/pending) | - Enrichment Run timestamp | - Enrichment Data (from 3rd party APIs) | +-- LLM Stage (AI processing) | - LLM Status (good/poor/processing) | - LLM Run timestamp | - LLM Data (AI-generated insights) | +-- Company Status (active/inactive/archived)
End-to-End Company Creation Flow
[Client/API Import]
|
v
HandleImportBulkCompanies
- Receives domains from Redis
- Deduplicates, filters personal emails
- Creates CompanyJobs in SF DB (status: WAITING)
|
v
HandleThreadCreateCompanies
- Reads waiting CompanyJobs (batch 500)
- Sends each domain to SQS
- Updates jobs to DONE
|
v
Handle_RevealedCompanies
- Checks account feature & quota
- Calls Kickfire API / TheCompaniesAPI
- Generates UUID v5 company ID
- Validates (not ISP/mobile/personal domain)
- Atomic quota reservation
- Stores in DynamoDB (company, IP-company, domain-company, account-company)
- Updates visitor/session records
- Sends to enrichment + BigQuery queues
|
v
HandleAddMoreDataToTheCompany
- Fetches extended data from TheCompaniesAPI
- Merges with existing company records
- Updates DynamoDB
- Triggers BigQuery sync
|
v
HandleCompanyBigQuery
- Maps company data to BigQuery schema
- Uploads JSON to S3
- BigQuery ingests from S3
|
v
[Analytics / Dashboards in datalayerapp-v2]
- Query builders serve company data
- CompanyIdentifier & CompanyMatch endpoints
Client-Side UI Flows
Company Discovery & Reveal Flow
- •User enables "Reveal companies" in Sources > Revealed Companies settings
- •System begins matching visitor IPs/domains to company database
- •Revealed companies appear in Insights > Revealed Companies report
- •Users click on company for full enriched profile modal
Target Accounts Management Flow
Target Accounts Page
+-- FIND ACCOUNTS Button
| +-- Opens FindAccountContext Modal
| +-- Users filter by Domain, Company Name, Revenue, etc.
| +-- CompanyTableInfo displays matching companies (grid, 20/page)
| +-- Users select via checkboxes
| +-- "Save Change" to add to target accounts list
|
+-- Target Accounts Full List
| +-- Domains already marked as target accounts
| +-- Edit BO (Big Opportunities) flag
| +-- Assign to Account Groups
| +-- Delete or export
|
+-- Account Groups
+-- DYNAMIC LIST - Rules-based automatic grouping
+-- LIST OF ACCOUNTS - Manual account list
+-- BIG OPPORTUNITIES - Default high-value group
Company Profile Detail Flow
Click on Company Name/Link (from any report) | v Modal opens (RecordProfileCompany) +-- Header: logo, name, domain, social links +-- Key metrics: sessions, users, conversions +-- Accordions: Description, Size, Industry, Location, Other Data +-- Related tables: All Pages, Sources, Conversions +-- People/User/Session details nested tables
Admin Flow
Admin > Accounts > Account Detail +-- Revealed Companies section: enable/disable, set monthly quota Admin > Centralized Company +-- View all centralized company records +-- Filter by account, status, quality score +-- View Detail: enrichment pipeline status (validation, enrichment, LLM) Admin > Company Matches +-- Daily company matching statistics +-- KickFire API usage metrics, confidence distribution
SQS Queues
| Queue | Purpose | Producer | Consumer |
|---|---|---|---|
HANDLE_REVEALED_COMPANIES_QUEUE | Domain revelation requests | HandleThreadCreateCompanies | Handle_RevealedCompanies |
HANDLE_ADD_MORE_DATA_TO_THE_COMPANY_QUEUE | Enrichment requests | Handle_RevealedCompanies | HandleAddMoreDataToTheCompany |
HANDLE_COMPANIES_BIGQUERY_QUEUE | BigQuery sync | Handle_RevealedCompanies, HandleAddMoreDataToTheCompany | HandleCompanyBigQuery |
HANDLE_GRAPH_MERGE_DATA_QUEUE | Person merge data | Handle_RevealedCompanies | Graph processing lambda |
Debugging Guide
Company not appearing after import
- •Check CompanyJobs table (llservices-salesforce): Verify job status is not stuck at
WAITING- •File:
llservices-salesforce/server/models/companyJobs.js-findUniqueAccountIds() - •Jobs must be 30+ min old to be picked up
- •File:
- •Check HandleThreadCreateCompanies logs: Verify SQS messages were sent
- •Check Handle_RevealedCompanies logs: Look for quota exceeded, feature disabled, or API errors
- •Check DynamoDB tables: Query
DYNAMODB_TABLE_COMPANYandDYNAMODB_TABLE_DOMAIN_COMPANYfor the domain
Company data incomplete or wrong
- •Check external API responses: Kickfire and TheCompaniesAPI may return partial data
- •Rate limiting: Check
companyDataService.jsfor backoff/retry logic
- •Rate limiting: Check
- •Check enrichment: Verify
HandleAddMoreDataToTheCompanyran successfully - •Check BigQuery sync: Verify
HandleCompanyBigQueryuploaded to S3
Quota issues
- •Check AccountStatistics table:
numberOfCompaniesRequestMonthlyvs account'smaxRequestMonthly - •Atomic reservation logic:
Handle_RevealedCompanies/models/dynamoHandler.js-atomicReserveQuota() - •Unlimited quota:
maxRequestMonthly = -1means unlimited - •Monthly reset:
handleCheckCompanyContractPlanMonthlyinserver/services/account.js
Personal domain filtered
- •Check constants:
Handle_RevealedCompanies/constants/index.jshas 442+ personal email domains - •Domains like gmail.com, yahoo.com, hotmail.com are excluded from company revelation
ISP/Mobile/WiFi filtered
- •Check blacklist:
Handle_RevealedCompanies/constants/blacklist.js - •Check API response flags:
isp,mobile,wififields from Kickfire API
Company ID generation
- •UUID v5 is generated from company name + domain
- •This ensures the same company always gets the same ID
- •Lookup:
Handle_RevealedCompanies/services/companyDataService.js
Target account not syncing to BigQuery
- •Check isSyncBigQuery flag:
TargetAccountstable - •Check BigQuery operations:
server/models/targetAccount.js-insertDataTargetAccountToBigQuery,updateDataTargetAccountToBigQuery - •Check schema:
server/constants/bigquery/schemas/revealedCompaniesStats/companyTargetAccount.js
Target account dynamic group not updating
- •Check group type: Must be
DYNAMIC_LIST - •Check conditions:
server/models/targetAccount.js-processRuleDynamicAccountGroup,getTargetAccountInGroupDynamic - •Check rule deserialization:
server/services/targetAccount.js-handleGetRuleGroup
Company enrichment pipeline status
- •Check CompanyIdentifier table: Validation, enrichment, and LLM statuses
- •Check CentralizedCompany table: Overall status, quality scores
- •Files:
server/models/companyIdentifier.js,server/models/centralizedCompany.js
Target Account Constants
File: server/constants/targetAccount.js
- •
DEFAULT_TARGET_ACCOUNT_GROUPS- Default "Big Opportunities" group template - •
DEFAULT_BO_NAME- "Big Opportunities" - •
TARGET_ACCOUNT_GROUP_TYPE-LIST_OF_ACCOUNTS,DYNAMIC_LIST - •
FIELD_UPDATE- 31 updatable company fields - •
COMPANY_BLACKLIST- 16 email domains (yahoo, gmail, hotmail, etc.) - •
MAPPING_COMPANY_DATA- 31 company data fields for serialization - •
REGEX_DOMAIN- Domain validation regex
Key Environment Variables
- •
API_KEY- Kickfire API key - •
THE_COMPANIES_API_TOKEN- TheCompaniesAPI token - •
REDIS_URL- Redis connection for bulk import data - •All
DYNAMODB_TABLE_*variables for table names - •All
*_QUEUE_URLvariables for SQS queues - •
POSTGRES_HOST,POSTGRES_USERNAME,POSTGRES_PASSWORD- PostgreSQL connection