Vell SEO Score for Marketplaces™¶
Overview¶
The Vell SEO Score for Marketplaces™ is a proprietary 0-100 scoring system that measures how "discoverable and persuasive" a specific cloud marketplace listing is. Unlike traditional domain-level SEO metrics, this is explicitly a page-level score supporting:
- AWS Marketplace:
https://aws.amazon.com/marketplace/pp/<listing-id> - Google Cloud Marketplace:
https://cloud.google.com/marketplace/product/<publisher>/<product>(coming soon) - Azure Marketplace:
https://azuremarketplace.microsoft.com/en-us/marketplace/apps/<listing-id>(coming soon)
The score combines three key components: - Listing Quality (LQ) - Internal PDP analysis - Backlink Authority (BA) - DataForSEO Backlinks API - AI Visibility (AIV) - DataForSEO LLM Mentions API
Score Components¶
Component Weights¶
| Component | Weight | Description |
|---|---|---|
| Listing Quality (LQ) | 40% | Content completeness, copy quality, differentiation |
| Backlink Authority (BA) | 25% | Referring domains, link quality, trends |
| AI Visibility (AIV) | 35% | LLM mentions, AI search visibility, positioning |
Overall Score Formula¶
Dynamic Weight Redistribution (Confidence-Based)¶
When DataForSEO APIs are unavailable, the system uses a confidence-based weight adjustment powered by the DynamicWeightCalculator. Rather than treating all data sources as equal, each component's weight is scaled by a confidence multiplier that reflects how reliable the underlying data is.
Data Source Confidence Tiers¶
| Tier | Multiplier | Description | Example |
|---|---|---|---|
| Measured | 1.00x | Real API data from DataForSEO | Backlinks API returns actual referring domain counts |
| Estimated | 0.70x | Proxy score from Bedrock/Claude analysis | Claude analyzes listing content to estimate backlink authority |
| Unavailable | 0.00x | No data available | Neither DataForSEO nor Bedrock can score this component |
The estimated multiplier (default 0.70) is configurable via the seo_weight_multiplier_estimated setting.
How It Works¶
- Each scoring component is classified as
measured,estimated, orunavailable - The ideal weight is multiplied by the confidence multiplier
- All raw weights are normalized to sum to 1.0
Weight Scenarios¶
| Scenario | LQ Source | BA Source | AIV Source | LQ Weight | BA Weight | AIV Weight | Confidence |
|---|---|---|---|---|---|---|---|
| All APIs active | measured | measured | measured | 40% | 25% | 35% | High |
| APIs down, Bedrock active | measured | estimated | estimated | ~49% | ~21% | ~30% | Medium |
| Only backlinks API active | measured | measured | estimated | ~44% | ~28% | ~28% | Medium |
| Only Bedrock, no APIs | measured | estimated | estimated | ~49% | ~21% | ~30% | Medium |
| Nothing available | measured | unavailable | unavailable | 100% | 0% | 0% | Low |
Formula¶
// DynamicWeightCalculator applies confidence multipliers per component
$rawWeights = [];
foreach ($idealWeights as $component => $idealWeight) {
$source = $componentSources[$component]; // measured | estimated | unavailable
$multiplier = $confidenceMultipliers[$source]; // 1.0 | 0.70 | 0.0
$rawWeights[$component] = $idealWeight * $multiplier;
}
// Normalize to sum to 1.0
$total = array_sum($rawWeights);
foreach ($rawWeights as $component => $raw) {
$normalizedWeights[$component] = $raw / $total;
}
Example: DataForSEO Down, Bedrock Fallback Active¶
When both Backlinks and LLM Mentions APIs are unavailable but Bedrock provides proxy scores:
Raw weights:
LQ: 0.40 x 1.00 (measured) = 0.400
BA: 0.25 x 0.70 (estimated) = 0.175
AIV: 0.35 x 0.70 (estimated) = 0.245
Total = 0.820
Normalized weights:
LQ: 0.400 / 0.820 = 48.8%
BA: 0.175 / 0.820 = 21.3%
AIV: 0.245 / 0.820 = 29.9%
MSS = (0.488 x LQ) + (0.213 x BA) + (0.299 x AIV)
Result: Listing Quality (always measured internally) naturally gets more influence, while Bedrock-estimated components still contribute meaningfully but at reduced weight.
UI Indicators¶
The UI reflects confidence levels: - "DataForSEO" badge (green) for measured components - "AI estimated" badge (blue) with adjusted % for estimated components - "Unavailable" badge (amber) for components without data - Confidence indicator ("Medium confidence" / "Low confidence") in the results header
API Response¶
The API response now includes weight adjustments and scoring confidence:
{
"score": 78,
"grade": "B",
"components": {
"listing_quality": 84,
"backlink_authority": 62,
"ai_visibility": 73
},
"weights": {
"listing_quality": 0.488,
"backlink_authority": 0.213,
"ai_visibility": 0.299
},
"scoring_confidence": "medium",
"weight_adjustments": {
"weights": { "listing_quality": 0.488, "backlink_authority": 0.213, "ai_visibility": 0.299 },
"adjustments": {
"backlink_authority": {
"ideal_weight": 0.25,
"data_source": "estimated",
"confidence_multiplier": 0.70,
"normalized_weight": 0.213
}
},
"overall_confidence": "medium"
}
}
Configuration¶
| Setting | Default | Description |
|---|---|---|
dataforseo_backlinks_enabled |
false | Enable Backlinks API (requires subscription) |
dataforseo_llm_mentions_enabled |
false | Enable LLM Mentions API ($100/month minimum) |
seo_weight_multiplier_measured |
1.00 | Weight multiplier for measured (real API) data |
seo_weight_multiplier_estimated |
0.70 | Weight multiplier for estimated (Bedrock) data |
seo_use_bedrock |
true | Enable Bedrock fallback when APIs unavailable |
Confidence Levels¶
| Level | Meaning | When |
|---|---|---|
| High | All components use real API data | All DataForSEO subscriptions active |
| Medium | Some components use AI estimates | Bedrock filling in for missing APIs |
| Low | Some components entirely missing | Neither API nor Bedrock available for a component |
1. Listing Quality (LQ) — 0-100¶
Source: Internal PDP/Launch Readiness Analyzer
Subscore Weights¶
| Subscore | Weight | Description |
|---|---|---|
| Completeness | 35% | Field presence and content adequacy |
| Copy Quality | 35% | Length, readability, structure |
| Differentiation | 15% | Unique value proposition signals |
| Conversion Hygiene | 15% | CTAs, pricing clarity, compliance |
LQ Formula¶
LQ = (completeness_score × 0.35) + (copy_quality_score × 0.35)
+ (differentiation_score × 0.15) + (conversion_hygiene_score × 0.15)
Field Completeness Requirements¶
| Field | Points | Description |
|---|---|---|
| Title | 10 | Product title (20-80 chars recommended) |
| Short Description | 15 | Brief summary (100-200 chars) |
| Long Description | 20 | Detailed description (500-3000 chars) |
| Highlights | 15 | Key features (3-10 items recommended) |
| Categories | 10 | Marketplace categories |
| Use Cases | 15 | Target use cases |
| Pricing | 10 | Pricing information |
| Support Info | 5 | Support details |
Copy Quality Checks¶
- Title length validation (min: 20, max: 80, ideal: 60)
- Short description completeness (min: 100 chars)
- Long description depth (min: 500, max: 3000 chars)
- Paragraph structure and bullet points
- Highlight count (min: 3, ideal: 5)
Differentiation Signals¶
Keywords that boost differentiation score: - "only", "unique", "first", "leading", "exclusive" - "patented", "proprietary", "innovative", "breakthrough"
Conversion Hygiene Checks¶
- Clear CTA presence ("get started", "try", "demo", "free trial")
- Pricing information visibility
- Support information availability
- Off-platform CTA spam detection
2. Backlink Authority (BA) — 0-100¶
Source: DataForSEO Backlinks API
Raw Metrics Collected¶
| Metric | API Endpoint |
|---|---|
| Referring Domains | /backlinks/summary/live |
| Total Backlinks | /backlinks/summary/live |
| Dofollow Backlinks | /backlinks/summary/live |
| New/Lost Backlinks (30d) | /backlinks/summary/live |
BA Subscore Weights¶
| Subscore | Weight | Description |
|---|---|---|
| RD Normalized | 50% | Referring domains vs category median |
| Dofollow Ratio | 30% | Percentage of dofollow links |
| Trend | 20% | Net backlink change direction |
BA Formula¶
RD_norm = min(listing_ref_domains / category_median_ref_domains, 2.0)
DF_ratio = dofollow_backlinks / total_backlinks
Trend = (new_backlinks - lost_backlinks) / max(1, total_backlinks / 10)
BA = (0.50 × scale_0_100(RD_norm / 2.0))
+ (0.30 × scale_0_100(DF_ratio))
+ (0.20 × scale_0_100((Trend + 1) / 2))
Category Benchmarks¶
Benchmarks are stored per category and include:
- median_referring_domains
- median_backlinks
- p75_referring_domains
- p90_referring_domains
Default benchmarks (when no category data): - Median referring domains: 50 - Median backlinks: 200
3. AI Visibility (AIV) — 0-100¶
Source: DataForSEO LLM Mentions API
Raw Metrics Collected¶
| Metric | API Endpoint |
|---|---|
| AI Visibility Score | /ai_optimization/llm_mentions/aggregated_metrics/live |
| Total Mentions | /ai_optimization/llm_mentions/aggregated_metrics/live |
| AI Search Volume | /ai_optimization/llm_mentions/aggregated_metrics/live |
| Position in Mentions | /ai_optimization/llm_mentions/top_domains/live |
AIV Subscore Weights¶
| Subscore | Weight | Description |
|---|---|---|
| Visibility Normalized | 60% | AI visibility vs category median |
| Position Score | 20% | Ranking in mentioned domains |
| Trend | 20% | Change from previous snapshot |
Position Score Mapping¶
| Position | Score |
|---|---|
| #1 | 100 |
| #2-5 | 80 |
| #6-10 | 60 |
| #11-20 | 40 |
| >20 | 20 |
AIV Formula¶
visibility_norm = min(ai_visibility_score / category_visibility_median, 2.0)
AIV = (0.60 × scale_0_100(visibility_norm / 2.0))
+ (0.20 × position_score)
+ (0.20 × visibility_trend)
Grade Bands¶
| Score Range | Grade | Label | Description |
|---|---|---|---|
| 90-100 | A | Market-Leading | Excellent discoverability and persuasion |
| 80-89 | B+ | Strong | Above average performance |
| 70-79 | B | Solid, Needs Push | Good foundation, room for improvement |
| 60-69 | C+ | Under-leveraged | Missing optimization opportunities |
| 50-59 | C | At Risk | Significant gaps in visibility |
| <50 | D/F | Invisible / Broken | Critical issues requiring immediate attention |
Weakness Detection¶
Listing Quality Weaknesses¶
| Code | Trigger | Description |
|---|---|---|
INCOMPLETE_FIELDS |
Missing required fields | Listing has incomplete sections |
POOR_COPY_QUALITY |
Copy score < 70 | Low quality or unclear product copy |
WEAK_DIFFERENTIATION |
Diff score < 60 | Missing unique value proposition |
POOR_CONVERSION_HYGIENE |
Hygiene score < 70 | Missing CTAs or compliance issues |
Backlink Authority Weaknesses¶
| Code | Trigger | Description |
|---|---|---|
FEW_REFERRING_DOMAINS |
RD < category median | Below average referring domains |
LOW_DOFOLLOW_RATIO |
DF ratio < 50% | Too many nofollow links |
DECLINING_BACKLINKS |
Lost > New (30d) | Negative link trend |
BELOW_CATEGORY_MEDIAN |
BA < benchmark | Underperforming vs peers |
AI Visibility Weaknesses¶
| Code | Trigger | Description |
|---|---|---|
LOW_LLM_MENTIONS |
Mentions < 10 | Few AI/LLM mentions |
LOW_AI_VISIBILITY_SCORE |
Score < median | Below category average |
NOT_IN_TOP_MENTIONS |
Position > 20 or null | Not ranking in AI results |
BELOW_CATEGORY_VISIBILITY |
AIV < benchmark | Underperforming vs peers |
Recommended Actions¶
Each weakness maps to recommended actions with AgentCore capability links:
For Listing Quality Issues¶
| Action ID | Priority | Capability | Description |
|---|---|---|---|
improve_listing_completeness |
High | generate_text_content |
Fill in missing fields |
improve_listing_copy |
High | refine_content |
Rewrite product descriptions |
enhance_differentiation |
Medium | competitor_analysis |
Strengthen value proposition |
optimize_ctas |
Medium | conversion_optimization |
Improve calls-to-action |
For Backlink Authority Issues¶
| Action ID | Priority | Capability | Description |
|---|---|---|---|
create_linkable_assets |
Medium | generate_content_series |
Create blog posts, guides |
improve_link_quality |
Low | outreach_campaign |
Pursue quality backlinks |
backlink_recovery |
High | link_reclamation |
Recover lost links |
For AI Visibility Issues¶
| Action ID | Priority | Capability | Description |
|---|---|---|---|
llm_seeding_campaign |
High | generate_content_series |
Create AI-optimized content |
boost_ai_visibility |
High | ai_optimization |
Improve AI discoverability |
improve_mention_ranking |
Medium | content_authority |
Build topical authority |
API Reference¶
Dashboard Routes¶
GET /dashboard/user/marketplace-seo-score # Dashboard view
POST /dashboard/user/marketplace-seo-score/analyze # Calculate new score
GET /dashboard/user/marketplace-seo-score/recent # Recent analyses
GET /dashboard/user/marketplace-seo-score/trend/{listingId} # Score history
GET /dashboard/user/marketplace-seo-score/top-performers # High performers
GET /dashboard/user/marketplace-seo-score/at-risk # At-risk listings
API Endpoint¶
Parameters:
- listingId (path) - AWS Marketplace listing ID
- refresh (query, optional) - Force recalculation if true
- category (query, optional) - Category code for benchmarking
- brand_keyword (query, optional) - Brand name for AI visibility
Response:
{
"listing_id": "pp-123456",
"url": "https://aws.amazon.com/marketplace/pp/pp-123456",
"score": 78,
"grade": "B",
"components": {
"listing_quality": 84,
"backlink_authority": 62,
"ai_visibility": 73
},
"weaknesses": [
{ "component": "backlink_authority", "code": "FEW_REFERRING_DOMAINS" },
{ "component": "ai_visibility", "code": "LOW_LLM_MENTIONS" }
],
"recommended_actions": [
{ "id": "improve_listing_copy", "priority": "high", "capability": "refine_content" },
{ "id": "create_linkable_assets", "priority": "medium", "capability": "generate_content_series" },
{ "id": "llm_seeding_campaign", "priority": "medium", "capability": "generate_content_series" }
],
"snapshot": {
"taken_at": "2025-12-08T15:30:00Z",
"previous_score": 70,
"change": 8
},
"details": {
"listing_quality_breakdown": {
"completeness_score": 90,
"copy_quality_score": 85,
"differentiation_score": 70,
"conversion_hygiene_score": 80
},
"backlink_metrics": {
"referring_domains": 45,
"total_backlinks": 120,
"dofollow_backlinks": 80,
"new_backlinks_30d": 5,
"lost_backlinks_30d": 2
},
"ai_visibility_metrics": {
"raw_score": 42,
"total_mentions": 18,
"position_in_mentions": 12,
"ai_search_volume": 250
}
}
}
AgentCore Integration¶
MarketplaceSeoInsightCapability¶
A dedicated AgentCore capability for retrieving and analyzing MSS scores.
Parameters:
| Parameter | Required | Default | Description |
|---|---|---|---|
listing_url |
Yes | - | AWS Marketplace listing URL |
category_code |
No | "default" | Category for benchmarking |
brand_keyword |
No | "" | Brand name for AI visibility |
include_raw_data |
No | false | Include detailed metrics |
include_recommendations |
No | true | Include action recommendations |
force_refresh |
No | false | Force recalculation |
Output Schema:
{
"type": "marketplace_seo_insight",
"score": 78,
"grade": "B",
"components": { ... },
"weaknesses": [ ... ],
"recommended_actions": [ ... ],
"summary": "Your listing is strong overall but underleveraged in backlinks...",
"suggested_playbooks": [
"improve_listing_copy",
"llm_seeding_campaign"
]
}
Playbook Mapping¶
Weaknesses automatically map to AgentCore playbooks:
| Component | Weakness | Playbook |
|---|---|---|
| Listing Quality | Low LQ | improve_listing_content |
| Backlink Authority | Low BA | create_linkable_assets |
| AI Visibility | Low AIV | llm_seeding_campaign |
Database Schema¶
marketplace_seo_scores¶
CREATE TABLE marketplace_seo_scores (
id BIGINT PRIMARY KEY,
team_id BIGINT,
user_id BIGINT,
listing_id BIGINT,
-- Listing identification
aws_listing_id VARCHAR(100),
listing_url VARCHAR(500),
category_code VARCHAR(100),
-- Overall score
score TINYINT UNSIGNED DEFAULT 0,
grade VARCHAR(3) DEFAULT 'F',
-- Component scores (0-100)
listing_quality DECIMAL(5,2) DEFAULT 0,
backlink_authority DECIMAL(5,2) DEFAULT 0,
ai_visibility DECIMAL(5,2) DEFAULT 0,
-- Listing Quality breakdown
listing_quality_breakdown JSON,
-- Backlink metrics
referring_domains INT UNSIGNED DEFAULT 0,
total_backlinks INT UNSIGNED DEFAULT 0,
dofollow_backlinks INT UNSIGNED DEFAULT 0,
new_backlinks_30d INT UNSIGNED DEFAULT 0,
lost_backlinks_30d INT UNSIGNED DEFAULT 0,
category_median_ref_domains DECIMAL(10,2),
-- AI Visibility metrics
ai_visibility_raw_score INT UNSIGNED DEFAULT 0,
total_llm_mentions INT UNSIGNED DEFAULT 0,
position_in_mentions SMALLINT UNSIGNED,
ai_search_volume INT UNSIGNED DEFAULT 0,
category_visibility_median DECIMAL(10,2),
-- Analysis results
weaknesses JSON,
recommended_actions JSON,
raw_data JSON,
-- Snapshot tracking
previous_score TINYINT UNSIGNED,
score_change TINYINT,
previous_snapshot_at TIMESTAMP,
-- Cost tracking
api_cost DECIMAL(8,4) DEFAULT 0,
created_at TIMESTAMP,
updated_at TIMESTAMP,
INDEX (aws_listing_id, created_at),
INDEX (team_id, created_at),
INDEX (score, created_at)
);
marketplace_seo_category_benchmarks¶
CREATE TABLE marketplace_seo_category_benchmarks (
id BIGINT PRIMARY KEY,
category_code VARCHAR(100) UNIQUE,
category_name VARCHAR(255),
-- Backlink benchmarks
median_referring_domains DECIMAL(10,2) DEFAULT 0,
median_backlinks DECIMAL(10,2) DEFAULT 0,
p75_referring_domains DECIMAL(10,2) DEFAULT 0,
p90_referring_domains DECIMAL(10,2) DEFAULT 0,
-- AI visibility benchmarks
median_ai_visibility DECIMAL(10,2) DEFAULT 0,
median_llm_mentions DECIMAL(10,2) DEFAULT 0,
p75_ai_visibility DECIMAL(10,2) DEFAULT 0,
p90_ai_visibility DECIMAL(10,2) DEFAULT 0,
-- Metadata
sample_size INT UNSIGNED DEFAULT 0,
last_calculated_at TIMESTAMP,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
UI Components¶
Score Gauge¶
- Circular progress indicator (0-100)
- Color-coded by grade (green → red)
- Animated fill on load
- Shows grade letter in center
Component Bars¶
Three horizontal progress bars showing: - Listing Quality (blue, 40% label) - Backlink Authority (green, 25% label) - AI Visibility (purple, 35% label)
Weaknesses Panel¶
- Grouped by component
- Color-coded badges
- Human-readable descriptions
Actions Panel¶
- Sorted by priority (High → Low)
- Priority badges (red/yellow/blue)
- Links to AgentCore capabilities
End-to-End Flow¶
-
User opens listing in Vell and clicks "Run Marketplace SEO Score"
-
Backend processes:
- Calls DataForSEO Backlinks API for backlink metrics
- Calls DataForSEO LLM Mentions API for AI visibility
- Runs ListingQualityAnalyzer on listing content
- Computes MSS using weighted formula
-
Saves snapshot to database
-
UI displays:
- Overall score (78) with grade (B)
- Component breakdown bars
- Top 3 weaknesses
-
Recommended action buttons
-
User clicks action (e.g., "Boost AI Visibility")
-
AgentCore executes:
- Runs
MarketplaceSeoInsightCapability - Planner maps
LOW_LLM_MENTIONS→llm_seeding_campaignplaybook -
Multi-step workflow generates content pack
-
30-60 days later:
- User reruns score
- MSS improves from 78 → 86
- Trend chart shows improvement
Configuration¶
Admin Settings¶
| Setting | Default | Description |
|---|---|---|
dataforseo_enabled |
false | Enable DataForSEO integration |
dataforseo_backlinks_enabled |
false | Enable Backlinks API |
dataforseo_llm_mentions_enabled |
false | Enable LLM Mentions API |
marketplace_seo_cache_ttl |
60 | Cache TTL in minutes |
seo_weight_multiplier_measured |
1.00 | Confidence multiplier for measured (API) data |
seo_weight_multiplier_estimated |
0.70 | Confidence multiplier for estimated (Bedrock) data |
seo_use_bedrock |
true | Enable Bedrock fallback when APIs unavailable |
API Costs (DataForSEO)¶
| API Call | Cost |
|---|---|
| Backlinks Summary | $0.002 |
| LLM Aggregated Metrics | $0.10 |
| LLM Top Domains | $0.10 |
Estimated cost per full analysis: ~$0.22
Files Reference¶
| File | Purpose |
|---|---|
app/Models/MarketplaceSeoScore.php |
Score snapshot model |
app/Models/MarketplaceSeoCategoryBenchmark.php |
Benchmark model |
app/Services/DataForSEO/MarketplaceSeoScoringService.php |
Core scoring logic |
app/Services/DataForSEO/DynamicWeightCalculator.php |
Confidence-based weight adjustment |
app/Services/DataForSEO/DynamicWeightResult.php |
Weight adjustment result DTO |
app/Services/DataForSEO/BedrockListingAnalyzer.php |
Bedrock fallback proxy scoring |
app/Services/DataForSEO/ListingQualityAnalyzer.php |
LQ component analyzer |
app/Services/DataForSEO/MarketplaceSeoScoreDTO.php |
Data transfer object |
app/Http/Controllers/Dashboard/User/MarketplaceSeoScoreController.php |
HTTP controller |
app/Extensions/ContentManager/System/Services/Capabilities/MarketplaceSeoInsightCapability.php |
AgentCore capability |
resources/views/default/panel/user/marketplace-seo-score/index.blade.php |
Dashboard view |
database/migrations/2025_12_08_150000_create_marketplace_seo_scores_table.php |
Database migration |
See Also¶
- SEO Intelligence - Domain-level SEO analysis
- AgentCore Capabilities Matrix - All available capabilities
- DataForSEO API Documentation