spot-competitor-sales-activity
Spot Competitor Sales Activity (Daily)
Spy on a competitor sales rep's LinkedIn activity to surface which accounts they're working. Cross-reference surfaced accounts with your pipeline to find competitive deals and net-new opportunities.
How to Use
- Identify your top 3-5 competitors' outbound sales reps on LinkedIn
- Set up a spy agent for each rep
- Cross-reference surfaced accounts with your pipeline:
- Account in your pipeline = competitive deal, accelerate
- Account not in your pipeline = net-new opportunity
- Accounts appearing across multiple competitor spy agents = hot market segment
API Calls
This skill bundles two scripts in the same directory as this SKILL.md file. Never read or reference API credentials directly.
signup.sh— handles authentication. Writes credentials to.envinternally. Never exposes the API key.api.sh— handles all authenticated API calls. Reads credentials from.envinternally.
First, resolve the script paths relative to this file's location:
SKILL_DIR="$(dirname "$(find ~/.agents/skills -name SKILL.md -path "*/spot-competitor-sales-activity/*" 2>/dev/null | head -1)")"
API="$SKILL_DIR/api.sh"
SIGNUP="$SKILL_DIR/signup.sh"
Then use $SIGNUP for auth and $API for all other calls.
When to Use This Skill
- "Spy on competitor sales reps"
- "Track what accounts Gong's AEs are working"
- "Monitor competitor SDR activity on LinkedIn"
- "Which accounts are Outreach's sales team engaging with"
Agent Rules
- NEVER rewrite or reframe the user's query. Use their exact words. Ask if unclear — don't modify yourself.
- Don't deploy signals without confirming. Signals cost credits. Always confirm before deploying.
- Present what the API returns. No fabrication, no inference.
- Input must be a person's LinkedIn URL. Not a company page. The agent monitors an individual rep's activity.
- Never output or log API credentials. All authenticated calls go through
api.sh.
Workflow
0. Agent Auth Check
Before anything, test if credentials are working by running:
bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 1, "offset": 0}}'
If the call succeeds (returns JSON with signals): skip to Step 1.
If the call fails (returns an error or missing credentials message):
### Welcome to OpenFunnel
OpenFunnel turns daily events in your market into pipeline
— using OpenFunnel's Event Intelligence engine.
To get started, I'll authenticate you via the API.
**What's your work email?**
Wait for user input. Then:
- Run
bash "$SIGNUP" start "<user_email>"- Returns
{"status": "verification_code_sent", "email": "..."}on success
- Returns
- Tell the user a 6-digit code was sent:
I sent a 6-digit verification code to **{email}**. Reply with the code. - Wait for input. Run
bash "$SIGNUP" verify "<user_email>" "<code>"- On success: returns
{"status": "authenticated", "user_id": "..."}. Credentials are written to.envand.gitignoreis updated automatically. - On failure: returns
{"status": "failed", ...}
- On success: returns
- Verify with
bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 1, "offset": 0}}' - If verification succeeds → continue to Step 1
- If sign-up fails → ask user to retry
- If verify fails → tell user the code was invalid or expired (up to 10 attempts in 24 hours), offer to retry or resend
1. Understand the request
The user needs to provide a competitor sales rep's LinkedIn profile URL. Must be an individual person, not a company page.
If the user names a competitor but doesn't provide a specific rep URL, ask for it.
Timeframe: Default: 7 days.
2. Check existing signals
Run bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 100, "offset": 0}}' to check for existing competitor activity signals monitoring the same URL.
If a match exists, present it and ask if the user wants to use it or deploy a new one.
3. Get results from existing signal
Run bash "$API" POST /api/v1/signal/ '{"signal_id": <id>}' to get accounts surfaced by this signal.
### Results from: {signal_name}
**{total_accounts} accounts surfaced | {total_people} people**
| Company | Domain | Activity Type |
|---------|--------|--------------|
| ... | | |
4. ICP Check
Fetch available ICP profiles: bash "$API" GET /api/v1/icp/list.
If ICPs exist: present them and let the user pick one, or "none" to skip.
If the user types "none" or skips ICP selection:
Auto-create a broad fallback ICP:
bash "$API" POST /api/v1/icp/create '{"name": "Broad Default ICP", "target_roles": ["Any"], "employee_ranges": ["1-10", "11-50", "51-200", "201-500", "501-1000", "1001-5000", "5001-10000", "10001+"], "location": ["Any"]}'
If no ICPs exist: offer quick setup or skip to auto-create broad fallback.
5. Confirm & Deploy
I'll deploy a **competitor activity** signal:
**Name:** {auto-generated descriptive name}
**Monitoring:** {LinkedIn URL of competitor rep}
**Timeframe:** {default — 7 days}
**ICP:** {selected or created ICP name}
⚡ *This will use credits from your plan.*
Other options:
- **Repeat daily** — re-run this signal every day for continuous monitoring (recommended)
- **Audience name** — auto-add results to a named audience
- **Credit limit** — cap spending on this signal
Set any of these, or "deploy" to go with defaults.
Wait for user input. Then deploy:
bash "$API" POST /api/v1/signal/deploy/competitor-activity-agent '{"name": "<name>", "linkedin_url": "<url>", "timeframe": <days>, "icp_id": <id>, "repeat": <true|false>}'
6. Post-deploy
Signal deployed: **{name}** (ID: {signal_id})
This is now monitoring this competitor rep's LinkedIn activity.
Results come in as they're found — just say "check on {signal_name}" anytime.
7. Check back
Run bash "$API" POST /api/v1/signal/ '{"signal_id": <id>}' to get results found so far.
More from openfunnel/openfunnel-skills
account-scoring
Score accounts 0-100 on pain-point relevance with evidence and reasoning
4advanced-account-setup
Advanced account setup — ICP profiles, blocklists, and integrations (Salesforce, HubSpot, Slack)
4enrich-accounts-with-contacts-and-emails
Enrich a list of company domains into account IDs, relevant contacts, and work emails. Use when the user has multiple accounts or domains and wants OpenFunnel to return account-level contact lists with email coverage.
4enterprise-account-research
Break into F500 accounts — find which team has the pain, who leads it, and the evidence
4provision-user
Create API-only OpenFunnel users on behalf of end-users. Use when an orchestrator or provider needs to provision OpenFunnel access programmatically for downstream users.
3live-view-alert-webhooks
Consume OpenFunnel live view alert webhooks by running a public HTTPS listener, verifying signed webhook requests, parsing saved-view insight payloads, and processing alerts safely. Use when the user wants a bot to receive or act on live view alerts via webhook.
1