assign-unowned-contacts
정보
이 스킬은 현재 담당자가 없는 마케팅 연락처에 자동으로 담당자를 할당하여 적절한 리드 배분과 책임 소재를 보장합니다. 소유자 기반 대시보드에서 모든 연락처가 표시되도록 하여 보고 격차를 해결하며, 라운드 로빈과 같은 배분 시스템과 통합됩니다. 기본 데이터 정리 작업 후에 사용하여 완전한 파이프라인 가시성과 후속 조치 프로세스를 유지하세요.
빠른 설치
Claude Code
추천npx skills add TomGranot/hubspot-admin-skills -a claude-code/plugin add https://github.com/TomGranot/hubspot-admin-skillsgit clone https://github.com/TomGranot/hubspot-admin-skills.git ~/.claude/skills/assign-unowned-contactsClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
Assign Unowned Marketing Contacts
Assign an owner to all marketing contacts that currently have no owner. Unowned contacts create gaps in reporting, prevent proper lead routing, and mean no one is accountable for follow-up on marketing-generated responses.
Why This Matters
Marketing contacts without an owner are a blind spot. They receive campaigns but no one sees their responses. They appear in aggregate metrics but not in individual pipeline views. In owner-based dashboards and reports, they simply do not exist. For teams using round-robin or territory-based routing, unowned contacts bypass the entire system.
Prerequisites
- Phase 1 hygiene and earlier Phase 3 enrichment processes completed
- Access to Contacts with permission to bulk edit owner assignments
- Approval from team leads before bulk assignment. This is a business decision, not just a technical one. Get sign-off on the assignment strategy before proceeding.
Interview: Gather Requirements
Before executing, collect the following information from the user:
Q1: Who should unowned contacts be assigned to?
- Examples: "Assign all to our Integration User", "Distribute across the sales team", "Assign to the Marketing Team user", "Assign to specific reps by territory"
- Default: No default -- this is a business decision that requires team lead approval
Q2: Should we use territory-based routing, round-robin, or a single catch-all owner?
- Examples: Territory-based (assign by geography or industry), round-robin (distribute evenly across active reps), catch-all (assign all to one user)
- Default: Catch-all to a single integration/service user as a temporary measure, with plans to implement proper routing later
Plan
- Identify all marketing contacts with no owner (before state)
- Decide on the assignment strategy (catch-all user vs. territory rules)
- Execute the bulk assignment
- Verify all marketing contacts have owners (after state)
Before State
Create the Unowned Marketing Contacts List
- Go to Contacts > Lists > Create list
- Select Active list
- Name:
CLEANUP: Unowned Marketing Contacts - Add filters:
- Marketing contact status > is any of > Marketing contact
- AND Contact owner > is unknown
- Save the list and note the count
Script Approach
import os
from hubspot import HubSpot
from dotenv import load_dotenv
load_dotenv()
api_client = HubSpot(access_token=os.getenv("HUBSPOT_API_TOKEN"))
# Count unowned marketing contacts
result = api_client.crm.contacts.search_api.do_search(
public_object_search_request={
"filterGroups": [{
"filters": [
{
"propertyName": "hs_marketable_status",
"operator": "EQ",
"value": "true"
},
{
"propertyName": "hubspot_owner_id",
"operator": "NOT_HAS_PROPERTY"
}
]
}],
"limit": 0
}
)
print(f"Unowned marketing contacts: {result.total}")
Execute
Assignment Strategy Decision
Choose one of these approaches (requires team lead approval):
Option A: Catch-All User (Simplest)
- Assign all unowned contacts to a single integration/service user
- Pro: Fast, ensures 100% coverage immediately
- Con: One "owner" accumulates a large number of contacts; not meaningful for routing
- Best when: You plan to implement proper routing later and just need coverage now
Option B: Territory/Region Rules
- Assign based on contact geography, industry, or company size
- Pro: More meaningful ownership, better for sales follow-up
- Con: Requires a defined routing matrix and more complex execution
- Best when: You have established sales territories
Option C: Round-Robin
- Distribute evenly across active sales reps
- Pro: Fair distribution, immediate accountability
- Con: May assign contacts to reps who do not cover that segment
- Best when: Small team, all reps handle all segments
Bulk Assignment via UI
- Open the unowned marketing contacts list
- Click the checkbox in the table header to select all contacts on the page
- Click Select all X contacts to select across all pages
- Click Edit in the toolbar
- In the property dropdown, select Contact owner
- Search for and select the chosen owner
- Click Update
- Confirm the bulk edit
- For large numbers (5,000+), HubSpot processes in batches. This may take several minutes.
Bulk Assignment via API
# Pattern for API-based assignment
# Useful for territory-based rules or when UI bulk edit times out
OWNER_ID = "your-owner-id" # Get from Owners API
# 1. Search for unowned marketing contacts (paginate through all)
# 2. Build batch update payload with hubspot_owner_id = OWNER_ID
# 3. Submit in batches of 100 via crm.contacts.batch_api.update
# For territory-based routing:
# 1. Search for unowned marketing contacts
# 2. For each contact, determine territory based on country/state/industry
# 3. Map territory to owner ID
# 4. Batch update with the appropriate owner per contact
API notes:
- Get owner IDs from the Owners API:
api_client.crm.owners.owners_api.get_page() - To find a specific owner by email: iterate through owners and match on
email - Batch update accepts up to 100 records per call
- Rate limit: 100 requests per 10 seconds
After State
Wait 5-10 minutes for HubSpot to finish processing, then verify.
# Re-run the same search
result = api_client.crm.contacts.search_api.do_search(
public_object_search_request={
"filterGroups": [{
"filters": [
{
"propertyName": "hs_marketable_status",
"operator": "EQ",
"value": "true"
},
{
"propertyName": "hubspot_owner_id",
"operator": "NOT_HAS_PROPERTY"
}
]
}],
"limit": 0
}
)
print(f"Unowned marketing contacts: {result.total} (should be 0)")
Verification checklist:
- The unowned marketing contacts list shows 0 contacts
- Re-run the before-state script — count should be 0
- Spot-check 5-10 contacts that were previously unowned — confirm they show the assigned owner
- Check owner-based dashboards/reports to confirm the previously invisible contacts now appear
Key Technical Learnings
- This is a business decision, not just a technical one. Always get approval from sales/marketing leadership on the assignment strategy before executing. Bulk-assigning contacts to the wrong people creates confusion and erodes trust.
- A catch-all user is a temporary solution. If you assign to a single integration user, plan a follow-up process to redistribute contacts to actual sales reps when proper routing is established.
- Pair with lead owner cleanup. Once proper routing is in place, revisit contacts under the catch-all user and reassign them to real owners.
- HubSpot bulk edit limits. For very large batches (10,000+), the UI bulk edit may time out. Use the API approach instead, which handles pagination and batching gracefully.
- New contacts need routing too. After this one-time cleanup, implement a workflow or lead rotation rule to automatically assign owners to new marketing contacts going forward.
GitHub 저장소
연관 스킬
railway-docs
문서이 스킬은 Railway의 기능, 작동 방식 또는 특정 문서 URL에 대한 질문에 답하기 위해 최신 Railway 문서를 가져옵니다. 개발자들이 Railway의 공식 소스로부터 정확하고 최신 정보를 직접 받을 수 있도록 보장합니다. 사용자가 Railway의 작동 방식을 묻거나 Railway 문서를 참조할 때 사용하세요.
n8n-code-python
문서이 Claude Skill은 n8n의 Code 노드에서 Python 코드를 작성할 때 전문적인 지침을 제공하며, 특히 Python 표준 라이브러리 사용과 n8n의 특수 구문인 `_input`, `_json`, `_node` 작업에 중점을 둡니다. 이는 개발자가 n8n 내에서 Python의 제한 사항을 이해하도록 돕고, 대부분의 워크플로에는 JavaScript 사용을 권장하면서도 특정 데이터 변환 요구사항에 대한 Python 솔루션을 제안합니다.
archon
문서Archon 스킬은 REST API를 통해 RAG 기반 시맨틱 검색과 프로젝트 관리를 제공합니다. 이 스킬을 사용하여 문서 검색, 계층적 프로젝트/태스크 관리, 문서 업로드 기능을 갖춘 지식 검색을 수행할 수 있습니다. 외부 문서를 검색할 때는 다른 소스를 사용하기 전에 항상 Archon을 최우선으로 활용하세요.
n8n-code-javascript
문서이 Claude Skill은 n8n의 Code 노드에서 JavaScript 코드 작성에 대한 전문적인 지침을 제공합니다. `$input`/`$json` 변수, HTTP 헬퍼, DateTime 처리와 같은 필수적인 n8n 특정 구문을 다루며 일반적인 오류를 해결합니다. Code 노드에서 사용자 정의 JavaScript 처리가 필요한 n8n 워크플로우를 개발할 때 활용하세요.
