From 3930adae0066920b939c579392e65194ac7dc99d Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:19:52 +0300 Subject: [PATCH 01/90] fix(adsense): make editorial pages content-first --- app/blog/[slug]/page.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index 4f9f09c..d374e31 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -7,9 +7,7 @@ import SocialShare from '../../../components/SocialShare'; import Footer from '../../../components/Footer'; import { absoluteUrl } from '../../../lib/site'; import { generateArticleSchema, generateBreadcrumbSchema, SchemaScript } from '../../../lib/schema'; -import AdSenseBlock from '../../../components/AdSenseBlock'; import { getRelatedBlogPosts } from '../../../lib/related-blog-posts'; -import SponsorSlot from '../../../components/SponsorSlot'; interface BlogPostPageProps { params: Promise<{ @@ -211,8 +209,6 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {

- - {/* Main Content */}
- {/* Internal Linking */}

Continue Your Research

@@ -283,7 +277,6 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
- {/* Related Shopping Resources */} From 01475b419252c47497896a8c2583b97286ad65c6 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:19:54 +0300 Subject: [PATCH 02/90] fix(adsense): make homepage editorial-first --- app/page.tsx | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 31fb2e4..882cce3 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -244,6 +244,30 @@ export default function Home() { +
+
+
+ Independent buyer research +

Research before you buy.

+

Saleh Store publishes practical buying research focused on specifications, compatibility, condition, total cost, seller terms, and the questions that can change a purchase decision. The guides are designed to help you understand the market before you follow a marketplace link.

+
+
+ +

Shopping Guides

+

Buyer-focused explanations and comparison frameworks.

+ + +

Research Method

+

How we compare marketplace listings without treating headline price as the whole decision.

+ + +

Editorial Standards

+

Our sourcing, transparency, and evidence standards for published guides.

+ +
+
+
+
@@ -274,8 +298,6 @@ export default function Home() { - - {catalogSource === 'ebay_live' && !isLoading && (
● Live eBay catalog active
)} {apiError && !isLoading && (
❌

Failed to Load Live Products

{apiError}

)} From d66ae397fc4f256cb4011b3a95b1855d1dca5e7d Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:20:14 +0300 Subject: [PATCH 03/90] docs(adsense): add approval readiness gate --- docs/ADSENSE_APPROVAL_GATE.md | 136 ++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 docs/ADSENSE_APPROVAL_GATE.md diff --git a/docs/ADSENSE_APPROVAL_GATE.md b/docs/ADSENSE_APPROVAL_GATE.md new file mode 100644 index 0000000..d5427e3 --- /dev/null +++ b/docs/ADSENSE_APPROVAL_GATE.md @@ -0,0 +1,136 @@ +# AdSense Approval Gate + +## Objective + +Restore saleh-store.com to AdSense review readiness after the Google decision: **Low value content**. + +This gate is an operational control, not a promise of approval. Google evaluates the live site and account; repository evidence can establish readiness work but cannot guarantee the external decision. + +## External policy baseline + +Google's current AdSense guidance requires unique, relevant content that provides users a reason to visit. Google specifically warns that affiliate-program content without sufficient added value can be a content-quality problem. Google also states that publisher content must remain the focal point of pages carrying Google ads. + +Authoritative references: +- https://support.google.com/adsense/answer/81904 +- https://support.google.com/adsense/answer/12176698 +- https://support.google.com/adsense/answer/7299563 +- https://support.google.com/publisherpolicies/answer/11112688 + +## OBSERVE — 2026-10-06 + +Verified repository state before remediation: +- 62 published shopping guides are documented in current project state. +- Editorial pages contain substantial server-rendered article text and an editorial-team identity. +- The homepage is heavily product/marketplace oriented and contains live eBay discovery, product cards, affiliate CTAs, and commercial merchandising surfaces. +- Blog articles previously contained both AdSense blocks and direct sponsorship slots around the editorial content. +- Older content contains repeated marketplace-buying patterns and some historical first-person/product claims that require editorial review before being treated as authoritative. +- Repository documentation has inconsistent article counts (61 vs 62), which is a documentation-governance defect. + +## ASSESS + +### Primary risk + +The likely approval risk is not lack of page count. It is insufficiently differentiated publisher value relative to the commercial eBay/affiliate layer. + +### Secondary risks + +1. Commercial surfaces can visually dominate the user journey. +2. Repeated buying-guide templates can make individually useful articles appear programmatic or interchangeable. +3. Historical first-person claims must not imply testing or experience that cannot be evidenced. +4. Product/category/search pages are not equivalent to editorial inventory and should not be treated as the site's primary content proof. +5. Documentation drift makes the content inventory less trustworthy. + +## PLAN + +The approval loop uses this order: + +publisher value → editorial integrity → commercial restraint → crawlability → verification → external review + +Do not respond to a low-value decision by simply generating more articles. + +### Quality gate for every indexable editorial article + +An article should have a clear reason to exist beyond sending the reader to eBay. It should provide original decision support, meaningful comparison logic, useful caveats/trade-offs, and claims that can be supported by the site's stated research method or an identifiable source. + +Reject or remediate articles that are primarily: +- generic marketplace advice with little differentiation +- repeated variants of another guide +- product-listing wrappers +- unsupported personal experience +- unsupported expert credentials +- price/availability claims presented as timeless facts +- affiliate CTAs with little editorial substance + +## EXECUTE — current increment + +### Completed in branch fix/adsense-editorial-value-gate + +1. Blog article pages were made content-first by removing direct AdSense blocks and direct sponsorship slots from the article body. +2. The homepage was changed to expose an explicit independent-buyer-research section before the main product merchandising flow. +3. The homepage now links directly to Shopping Guides, the eBay Deal Comparison Methodology research asset, and Editorial Standards. +4. This branch keeps affiliate functionality intact; it changes the hierarchy so research value is visible before commerce conversion. + +Commits: +- 3930adae0066920b939c579392e65194ac7dc99d — content-first blog pages +- 01475b419252c47497896a8c2583b97286ad65c6 — editorial-first homepage + +## NEXT EXECUTION GATES + +### Gate A — content inventory + +Audit all 62 articles and assign: + +KEEP | REWRITE | MERGE | NOINDEX | REMOVE + +Score each article for: +- originality +- information density +- evidence quality +- factual-risk level +- repetition +- commercial intent +- buyer-decision value + +### Gate B — article remediation + +Rewrite or consolidate the weak cohort. Do not inflate word count merely to satisfy a numeric target. + +### Gate C — commercial-surface review + +Review product, category, search, homepage, sponsor, and affiliate surfaces. The editorial corpus must remain the site's primary evidence of publisher value. + +### Gate D — technical verification + +Run: +- conflict verification +- lint +- typecheck +- tests +- production build +- live route smoke tests +- robots/sitemap checks +- canonical/indexability checks + +### Gate E — production evidence + +Verify the deployed saleh-store.com routes after merge. Do not claim deployment success from a Git commit alone. + +### Gate F — AdSense decision + +Only after the remediation and live verification gates pass should the site be marked READY_FOR_REVIEW. + +READY_FOR_REVIEW means the repository and live-site evidence are internally ready for a new AdSense request. It does not mean Google has approved the site. + +## Current decision + +REMEDIATION_IN_PROGRESS + +The first architectural/content-hierarchy increment is implemented. The site is **not yet declared AdSense-ready** because the 62-article quality inventory and live production verification remain outstanding. + +## Agent loop rule + +Every future AdSense iteration must record: + +OBSERVE → ASSESS → PLAN → EXECUTE → VERIFY → RECORD → DECIDE + +No agent may skip VERIFY or convert a repository change into an approval claim. From 696039a1f5198c0773e74879734d0dba02c38b47 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:20:19 +0300 Subject: [PATCH 04/90] docs(adsense): add content-value operating gate --- AGENTS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 540b2ed..3c547be 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,6 +82,10 @@ Do not fabricate personal experiences, tests, expert credentials, prices, produc Affiliate disclosure must remain intact. +### AdSense content-value gate + +When the repository is under an AdSense low-value-content remediation, treat publisher value as a first-class acceptance gate. Editorial content must be the focal user value, not a wrapper around eBay inventory or affiliate conversion. Do not solve a low-value decision by mass-producing generic articles. Audit originality, evidence, repetition, factual risk, and commercial intent before publishing or expanding content. Keep AdSense blocks and sponsorship surfaces out of editorial content when they materially compete with the content's focal purpose. See `docs/ADSENSE_APPROVAL_GATE.md`. + ## SEO / AI visibility rules SEO work must preserve: From 8d343a16e7d3b8d41af213edccc1ca68375af0e4 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:20:24 +0300 Subject: [PATCH 05/90] docs(adsense): record low-value remediation state --- docs/PROJECT_STATUS.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index 4492bbe..520ece3 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -123,3 +123,20 @@ A direct sponsorship system was added independently of AdSense. The public sales Advertiser contact channels are Telegram @OssamaHashim and ossama.hashim.m@gmail.com. Package pricing is intentionally Custom quote rather than an unverified market-rate claim. AdSense remains implemented through AdSenseBlock and is not used as a sponsor fallback. + + +## AdSense low-value remediation — 2026-10-06 + +Google AdSense currently reports **Low value content** for saleh-store.com. This is treated as an external approval decision, not a repository defect with a single deterministic fix. + +A dedicated remediation loop is tracked in `docs/ADSENSE_APPROVAL_GATE.md` using OBSERVE → ASSESS → PLAN → EXECUTE → VERIFY → RECORD → DECIDE. + +Current branch: `fix/adsense-editorial-value-gate`. + +Completed in the current increment: +- Blog article pages were made content-first by removing direct AdSense and sponsorship blocks from article bodies. +- Homepage now presents an explicit independent-buyer-research section before the primary product merchandising flow. +- Editorial Standards, Research Method, and Shopping Guides are surfaced as first-class research destinations. +- AGENTS.md now treats publisher-value and commercial-restraint checks as an explicit AdSense remediation gate. + +Current decision remains `REMEDIATION_IN_PROGRESS`. Do not mark the site READY_FOR_REVIEW until the article-level quality inventory, technical verification, and live production verification pass. From 9de933b84220e538682dfa84dc71a753587aa4e4 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:21:10 +0300 Subject: [PATCH 06/90] content(adsense): remove unsupported editorial claims --- lib/blog-data.ts | 339 +++++++++++------------------------------------ 1 file changed, 76 insertions(+), 263 deletions(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index 8910135..1a91f09 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -20,270 +20,83 @@ export interface BlogArticle { export const blogArticles: BlogArticle[] = [ { - id: 1, - slug: 'ultimate-guide-finding-hidden-gems-ebay', - title: 'The Complete Professional Guide to Finding Overlooked Deals on eBay (2026)', - excerpt: 'A practical research method for finding overlooked eBay listings by comparing search variations, listing conditions, timing, seller terms, and completed-sale evidence.', - date: 'February 16, 2026', - category: 'Shopping Strategies', - readTime: '18 min read', - author: 'Saleh Store Editorial Team', - authorBio: 'The Saleh Store editorial team documents practical marketplace research methods, price-comparison techniques, and buyer-safety checks for eBay shoppers.', - gradient: 'from-blue-500 to-indigo-600', - content: [ - { type: 'paragraph', text: 'A useful eBay search starts with the recognition that visible results do not represent every potentially relevant listing. Search wording, filters, condition, seller location, and other listing details can materially change what a buyer sees.' }, - - { type: 'paragraph', text: 'Small listing errors can materially affect visibility. A misspelled model name, incomplete description, or unusual wording can make a listing harder to find, which is one reason buyers should test several search variations rather than relying on a single query.' }, - - { type: 'paragraph', text: 'These factors can influence competition and price, but none guarantees a bargain. Buyers should treat unusual titles, timing, condition, and listing friction as signals to investigate rather than evidence that an item is underpriced.' }, - - { type: 'paragraph', text: 'This guide focuses on repeatable research steps rather than shortcuts. Some are simple search techniques; others require comparing several listings and checking completed-sale evidence before deciding whether a price is reasonable.' }, - - { type: 'heading', text: 'Why Many Buyers Never See Real Deals' }, - - { type: 'paragraph', text: 'eBay processes an enormous volume of listings every year across dozens of categories and markets. Search results are filtered, ranked, and condensed aggressively. What you see on page one is not "everything available." It\'s what the algorithm believes most buyers want to see.' }, - - { type: 'paragraph', text: 'Most users:' }, - - { type: 'list', items: [ - 'Search with default settings', - 'Browse during peak hours', - 'Focus on perfectly titled listings', - 'Compete for the same visible inventory' - ]}, - - { type: 'paragraph', text: 'As a result, they all converge on the same prices.' }, - - { type: 'paragraph', text: 'Better outcomes come from diverging, not competing.' }, - - { type: 'heading', text: 'Strategy 1: Advanced Search Is the Real Marketplace' }, - - { type: 'paragraph', text: 'The Advanced Search feature quietly filters out most casual buyers. That alone creates opportunity.' }, - - { type: 'paragraph', text: 'The most consistently useful filters:' }, - - { type: 'list', items: [ - 'Auctions ending soon', - 'Used or open-box condition', - 'Listings with "Best Offer" enabled', - 'Domestic sellers only', - 'Completed listings for price validation' - ]}, - - { type: 'paragraph', text: 'These filters don\'t magically create deals. They simply reduce competition — which is often all that\'s required.' }, - - { type: 'heading', text: 'Strategy 2: Misspellings Create Invisible Listings' }, - - { type: 'paragraph', text: 'Search engines match text literally. A misspelled product title doesn\'t just look unprofessional — it becomes effectively hidden.' }, - - { type: 'paragraph', text: 'Common error patterns appear repeatedly:' }, - - { type: 'list', items: [ - 'Missing letters', - 'Phonetic spelling', - 'Hyphenation differences', - 'Singular vs plural variations' - ]}, - - { type: 'paragraph', text: 'Searching for these variants takes minutes and often reveals listings with little to no attention.' }, - - { type: 'paragraph', text: 'The value here isn\'t the typo itself. It\'s the absence of competition that follows it.' }, - - { type: 'heading', text: 'Strategy 3: Timing Beats Aggression' }, - - { type: 'paragraph', text: 'Price pressure on eBay fluctuates predictably.' }, - - { type: 'paragraph', text: 'Auctions ending during high-traffic windows attract more bidders. Auctions ending during low-activity periods often do not — regardless of item quality.' }, - - { type: 'paragraph', text: 'Consistently lower competition appears:' }, - - { type: 'list', items: [ - 'Late night / early morning hours', - 'Mid-week endings', - 'Periods when casual browsing drops' - ]}, - - { type: 'paragraph', text: 'Waiting for the right ending time is often more effective than bidding harder.' }, - - { type: 'heading', text: 'Strategy 4: Seasonal Supply Cycles Matter' }, - - { type: 'paragraph', text: 'Market prices move with human behavior, not logic.' }, - - { type: 'paragraph', text: 'Post-holiday oversupply, end-of-month cash needs, and seasonal category shifts all affect pricing. Understanding when sellers list items is just as important as what they list.' }, - - { type: 'paragraph', text: 'The key isn\'t predicting exact prices. It\'s recognizing relative pressure.' }, - - { type: 'heading', text: 'Strategy 5: Seller Motivation Is Visible' }, - - { type: 'paragraph', text: 'Some listings quietly signal urgency:' }, - - { type: 'list', items: [ - 'Long active durations', - 'Multiple similar items', - 'Poor photography', - 'Downsizing language' - ]}, - - { type: 'paragraph', text: 'These indicators don\'t guarantee acceptance, but they change negotiation odds.' }, - - { type: 'paragraph', text: 'Effective offers are:' }, - - { type: 'list', items: [ - 'Specific', - 'Reasoned', - 'Polite', - 'Timed when sellers are mentally done waiting' - ]}, - - { type: 'heading', text: 'Strategy 6: Refurbished Isn\'t a Compromise' }, - - { type: 'paragraph', text: 'Manufacturer-refurbished and open-box items exist in a pricing blind spot. Many buyers avoid them categorically. That avoidance creates value.' }, - - { type: 'paragraph', text: 'The gap between functional quality and perceived risk is where the discount lives.' }, - - { type: 'heading', text: 'Strategy 7: The Watch List Is a Signal' }, - - { type: 'paragraph', text: 'Adding items to a watch list isn\'t passive. It signals interest without commitment.' }, - - { type: 'paragraph', text: 'Over time, this often triggers:' }, - - { type: 'list', items: [ - 'Price reductions', - 'Offer invitations', - 'Seller follow-ups' - ]}, - - { type: 'paragraph', text: 'Waiting is not inactivity. It\'s leverage.' }, - - { type: 'heading', text: 'Strategy 8: Local Pickup Is Friction — and Friction Lowers Prices' }, - - { type: 'paragraph', text: 'Items that require effort to collect attract fewer buyers. That friction is reflected in price.' }, - - { type: 'paragraph', text: 'For buyers willing to travel short distances safely, local pickup listings often carry disproportionate discounts.' }, - - { type: 'heading', text: 'Strategy 9: "For Parts" Doesn\'t Always Mean Broken' }, - - { type: 'paragraph', text: 'Many listings labeled as defective are incomplete diagnoses, not irreparable damage.' }, - - { type: 'paragraph', text: 'Buyers with basic technical awareness can evaluate:' }, - - { type: 'list', items: [ - 'Common failure points', - 'Cost of replacement parts', - 'Risk vs reward' - ]}, - - { type: 'paragraph', text: 'This strategy is optional — but powerful.' }, - - { type: 'heading', text: 'Strategy 10: Bundles Hide Individual Value' }, - - { type: 'paragraph', text: 'Bulk listings are priced for convenience, not optimization.' }, - - { type: 'paragraph', text: 'Buying a lot, extracting high-value items, and redistributing the rest often results in net gains even when keeping only a portion of the items.' }, - - { type: 'heading', text: 'Strategy 11: End-of-Month Pressure Is Real' }, - - { type: 'paragraph', text: 'Many sellers operate on personal cash flow cycles. Late-month listings and negotiations often carry higher acceptance rates — not because the item is worse, but because timing matters.' }, - - { type: 'heading', text: 'Strategy 12: Completed Listings Reveal Reality' }, - - { type: 'paragraph', text: 'Asking prices are opinions. Completed listings are facts.' }, - - { type: 'paragraph', text: 'Evaluating actual sale data prevents emotional pricing and protects margin discipline.' }, - - { type: 'heading', text: 'Strategy 13: Saved Searches Create Speed' }, - - { type: 'paragraph', text: 'Being early matters. Saved searches with alerts provide time advantage — not certainty, but opportunity.' }, - - { type: 'heading', text: 'Strategy 14: Bundling Benefits Sellers Too' }, - - { type: 'paragraph', text: 'Multiple items, one transaction, immediate payment — sellers value certainty. Structured bundle offers often outperform single-item negotiation.' }, - - { type: 'heading', text: 'A Practical 30-Day Framework' }, - - { type: 'paragraph', text: 'Rather than applying everything at once:' }, - - { type: 'list', items: [ - 'Select a few categories', - 'Observe pricing behavior', - 'Track outcomes', - 'Adjust search parameters' - ]}, - - { type: 'paragraph', text: 'Consistency beats intensity.' }, - - { type: 'heading', text: 'Final Thought' }, - - { type: 'paragraph', text: 'Successful buying on eBay isn\'t about tricks.' }, - - { type: 'paragraph', text: 'It\'s about seeing what others overlook and waiting when others rush.' }, - - { type: 'paragraph', text: 'Most shoppers compete. Professionals filter.' }, - - { type: 'paragraph', text: 'That difference compounds.' }, - - { type: 'heading', text: 'Disclosure' }, - - { type: 'paragraph', text: 'This site participates in the eBay Partner Network. Some outbound links may earn commissions at no additional cost to the buyer.' } - ] - }, + id: 1, + slug: 'ultimate-guide-finding-hidden-gems-ebay', + title: 'How to Find Overlooked eBay Listings: A Practical Research Method', + excerpt: 'A repeatable method for comparing search variations, listing condition, seller terms, total cost, and completed-sale evidence without assuming that an unusual listing is automatically a bargain.', + date: 'February 16, 2026', + category: 'Shopping Strategies', + readTime: '12 min read', + author: 'Saleh Store Editorial Team', + authorBio: 'The Saleh Store editorial team publishes practical marketplace research methods and buyer decision frameworks based on observable listing information and documented comparison criteria.', + gradient: 'from-blue-500 to-indigo-600', + content: [ + { type: 'paragraph', text: 'Finding an overlooked eBay listing is less about a secret trick and more about reducing the number of assumptions in a purchase decision. A useful process compares multiple listings, verifies the exact product variant, checks condition and seller terms, and uses completed-sale evidence when available.' }, + { type: 'heading', text: 'Start With the Exact Product' }, + { type: 'paragraph', text: 'Model numbers, generations, storage, regional variants, bundle contents, and condition can change value substantially. Search broadly first, then narrow to the exact configuration you would actually buy.' }, + { type: 'heading', text: 'Use Search Variations as a Research Tool' }, + { type: 'paragraph', text: 'Try the exact model number, common naming variations, and relevant configuration terms. A different query can expose listings that a broad product-name search does not surface, but visibility alone is not evidence of a good price.' }, + { type: 'heading', text: 'Compare Condition Before Price' }, + { type: 'paragraph', text: 'New, open-box, refurbished, used, and for-parts listings are different products from a risk perspective. Compare like with like before deciding that one listing is cheaper.' }, + { type: 'heading', text: 'Calculate Total Delivered Cost' }, + { type: 'paragraph', text: 'The useful comparison is not headline price alone. Include shipping, taxes where applicable, required accessories, and likely replacement costs when those factors are known.' }, + { type: 'heading', text: 'Use Completed Sales to Test the Asking Price' }, + { type: 'paragraph', text: 'An asking price is a seller expectation, not proof of market value. When completed-sale information is available, compare several comparable transactions and account for differences in configuration and condition.' }, + { type: 'heading', text: 'Inspect Seller and Return Terms' }, + { type: 'paragraph', text: 'Seller information, return conditions, item location, and the detail of the listing description can change the practical risk of a purchase. A slightly higher price can be reasonable when uncertainty is materially lower.' }, + { type: 'heading', text: 'A Repeatable Comparison Workflow' }, + { type: 'list', items: [ + 'Define the exact product and configuration you need.', + 'Collect several comparable listings.', + 'Normalize condition, accessories, shipping, and total cost.', + 'Check seller information and return terms.', + 'Use completed-sale evidence when available.', + 'Record unanswered questions before making the purchase decision.' + ]}, + { type: 'heading', text: 'What This Method Does Not Prove' }, + { type: 'paragraph', text: 'An unusual title, low asking price, old listing, or local-pickup requirement does not automatically mean a bargain exists. These are research signals, not guarantees. The value comes from verifying the underlying evidence.' }, + { type: 'heading', text: 'Disclosure' }, + { type: 'paragraph', text: 'Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer.' } + ] +}, { - id: 2, - slug: 'electronics-buying-guide-best-tech-deals', - title: 'Electronics Buying Guide: Best Tech Deals Worth Your Money', - excerpt: 'A practical comparison of laptops, tablets, smartphones, and accessories, with emphasis on specifications, condition, compatibility, and total cost.', - date: 'February 14, 2026', - category: 'Product Reviews', - readTime: '15 min read', - author: 'Saleh Store Editorial Team', - authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides based on specifications, price comparison, compatibility, condition, and purchase terms.', - gradient: 'from-purple-500 to-pink-600', - content: [ - { type: 'paragraph', text: 'The useful way to compare electronics is to look beyond the headline discount. Exact configuration, condition, compatibility, included accessories, current price, shipping, and return terms can change the value of a listing substantially.' }, - { type: 'heading', text: 'Best Budget Laptop: Refurbished Lenovo ThinkPad' }, - { type: 'paragraph', text: 'Refurbished business laptops can be useful alternatives at lower prices, but the exact model, age, condition, battery, and upgrade options should be checked before buying:' }, - { type: 'list', items: [ - 'Lenovo ThinkPad T480: $250-350 on eBay, originally $1,200+', - 'Intel i5-8250U processor - handles multitasking perfectly', - 'Upgradeable RAM and SSD - I added 16GB RAM for $35', - 'Military-grade durability - literally dropped mine, no damage', - 'Battle-tested keyboards - best typing experience under $1,000' - ]}, - { type: 'quote', text: 'Why buy a $500 plastic laptop that lasts 2 years when a $300 ThinkPad lasts 5+ years?' }, - { type: 'heading', text: 'Best Smartphone Value: iPhone SE (3rd Gen)' }, - { type: 'paragraph', text: 'Used iPhone SE: $200-250 on eBay vs $429 new. Here is why it is the smartest buy:' }, - { type: 'list', items: [ - 'Same A15 Bionic chip as iPhone 13 Pro - flagship performance', - 'Apple updates for 5+ years minimum - better than Android flagships', - 'Trade-in value stays high - sell it later for $100-150', - 'Compact size fits in pockets - no awkward phone bulge', - '5G capable - future-proof for years' - ]}, - { type: 'paragraph', text: 'For a used phone, evaluate the exact model, storage, battery condition, network compatibility, screen and camera condition, included accessories, and return terms before comparing its price with newer alternatives.' }, - { type: 'heading', text: 'Best Tablet: iPad 9th Gen (Refurbished)' }, - { type: 'paragraph', text: 'Tablet value depends on software support, performance, display, accessories, and intended use. Compare the exact configuration rather than assuming one platform is universally better:' }, - { type: 'list', items: [ - 'Refurbished iPad 9th Gen: $200-250 vs $329 new', - 'A13 Bionic chip - faster than most laptops', - 'iPadOS optimization - Android tablets feel janky in comparison', - 'Apple Pencil support - great for notes and art ($89 pencil, but worth it)', - 'Massive app library - actual tablet apps, not stretched phone apps' - ]}, - { type: 'heading', text: 'What to Avoid' }, - { type: 'paragraph', text: 'Save your money - these are traps:' }, - { type: 'list', items: [ - 'Any Chromebook under $200 - painfully slow, terrible screens', - 'Budget Android tablets - laggy UI, abandoned after 1-2 years', - 'No-name Chinese smartwatches - privacy nightmare, break quickly', - 'Budget wireless earbuds under $30 - sound quality is actual torture', - 'Extended warranties - statistical money losers' - ]}, - { type: 'heading', text: 'Where to Buy' }, - { type: 'paragraph', text: 'Compare refurbishment standards, seller information, warranty coverage, return terms, condition, and total cost across marketplace and manufacturer options. There is no universal seller-rating threshold that guarantees a good purchase.' }, - { type: 'heading', text: 'Disclosure' }, - { type: 'paragraph', text: 'Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer.' } - ] - }, + id: 2, + slug: 'electronics-buying-guide-best-tech-deals', + title: 'Electronics Buying Guide: How to Compare Value Before You Buy', + excerpt: 'A practical framework for comparing laptops, phones, tablets, and accessories by configuration, condition, compatibility, total cost, support, and return terms.', + date: 'February 14, 2026', + category: 'Product Reviews', + readTime: '12 min read', + author: 'Saleh Store Editorial Team', + authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides based on specifications, compatibility, condition, total cost, and purchase terms.', + gradient: 'from-purple-500 to-pink-600', + content: [ + { type: 'paragraph', text: 'Electronics are easy to compare badly because the headline specification or discount can hide the details that determine whether a product is actually useful. A better comparison starts with the job the device must perform and then evaluates configuration, condition, compatibility, total cost, support, and return terms.' }, + { type: 'heading', text: 'Define the Use Case First' }, + { type: 'paragraph', text: 'A laptop for office work, a phone for photography, and a tablet for reading have different priorities. Define the workload before comparing processor names, storage, display size, or discounts.' }, + { type: 'heading', text: 'Compare Exact Configurations' }, + { type: 'paragraph', text: 'The same model name can cover different processors, memory, storage, connectivity, regional variants, and included accessories. Compare the exact configuration rather than the product family.' }, + { type: 'heading', text: 'Used and Refurbished Need a Different Checklist' }, + { type: 'paragraph', text: 'Condition is part of the product. Check battery health when relevant, physical condition, replaced components, activation or carrier status, included accessories, seller information, and return terms.' }, + { type: 'heading', text: 'Do Not Treat the Largest Discount as the Best Value' }, + { type: 'paragraph', text: 'A discount percentage is only useful when the underlying price is a sensible comparison point. Compare several current listings and, where available, completed-sale evidence for equivalent configurations.' }, + { type: 'heading', text: 'Think About Support and Compatibility' }, + { type: 'paragraph', text: 'Software support, operating-system compatibility, ports, network bands, accessories, and replacement availability can matter more than a small specification advantage. Check the requirements that affect your actual use.' }, + { type: 'heading', text: 'A Practical Electronics Comparison' }, + { type: 'list', items: [ + 'Define the workload and must-have features.', + 'Identify the exact model and configuration.', + 'Compare condition and included accessories.', + 'Calculate delivered cost rather than headline price.', + 'Check compatibility, support, and return terms.', + 'Compare multiple equivalent listings before deciding.' + ]}, + { type: 'heading', text: 'Where Marketplace Research Adds Value' }, + { type: 'paragraph', text: 'Marketplace research is most useful when it helps a buyer compare real configurations and terms that are easy to miss in a generic product specification. The purpose of this guide is to improve that comparison, not to declare a universal best product.' }, + { type: 'heading', text: 'Disclosure' }, + { type: 'paragraph', text: 'Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer.' } + ] +}, { id: 3, slug: 'spot-counterfeit-products-security-checklist', From fe70dbd6ddb652041bad9053efbb53da973f4875 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:21:16 +0300 Subject: [PATCH 07/90] docs(content): remove unsupported personal-testing claim From 9a3adad5090462ae5f5da86d94ef4c279b2c1e65 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:22:08 +0300 Subject: [PATCH 08/90] content(adsense): quarantine thin legacy guides --- lib/blog-data.ts | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index 1a91f09..d14e85a 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -9,6 +9,7 @@ export interface BlogArticle { readTime: string; author: string; authorBio: string; + indexable?: boolean; gradient: string; relatedCategorySlugs?: string[]; content: Array<{ @@ -45,14 +46,7 @@ export const blogArticles: BlogArticle[] = [ { type: 'heading', text: 'Inspect Seller and Return Terms' }, { type: 'paragraph', text: 'Seller information, return conditions, item location, and the detail of the listing description can change the practical risk of a purchase. A slightly higher price can be reasonable when uncertainty is materially lower.' }, { type: 'heading', text: 'A Repeatable Comparison Workflow' }, - { type: 'list', items: [ - 'Define the exact product and configuration you need.', - 'Collect several comparable listings.', - 'Normalize condition, accessories, shipping, and total cost.', - 'Check seller information and return terms.', - 'Use completed-sale evidence when available.', - 'Record unanswered questions before making the purchase decision.' - ]}, + { type: 'list', items: ['Define the exact product and configuration you need.', 'Collect several comparable listings.', 'Normalize condition, accessories, shipping, and total cost.', 'Check seller information and return terms.', 'Use completed-sale evidence when available.', 'Record unanswered questions before making the purchase decision.'] }, { type: 'heading', text: 'What This Method Does Not Prove' }, { type: 'paragraph', text: 'An unusual title, low asking price, old listing, or local-pickup requirement does not automatically mean a bargain exists. These are research signals, not guarantees. The value comes from verifying the underlying evidence.' }, { type: 'heading', text: 'Disclosure' }, @@ -83,14 +77,7 @@ export const blogArticles: BlogArticle[] = [ { type: 'heading', text: 'Think About Support and Compatibility' }, { type: 'paragraph', text: 'Software support, operating-system compatibility, ports, network bands, accessories, and replacement availability can matter more than a small specification advantage. Check the requirements that affect your actual use.' }, { type: 'heading', text: 'A Practical Electronics Comparison' }, - { type: 'list', items: [ - 'Define the workload and must-have features.', - 'Identify the exact model and configuration.', - 'Compare condition and included accessories.', - 'Calculate delivered cost rather than headline price.', - 'Check compatibility, support, and return terms.', - 'Compare multiple equivalent listings before deciding.' - ]}, + { type: 'list', items: ['Define the workload and must-have features.', 'Identify the exact model and configuration.', 'Compare condition and included accessories.', 'Calculate delivered cost rather than headline price.', 'Check compatibility, support, and return terms.', 'Compare multiple equivalent listings before deciding.'] }, { type: 'heading', text: 'Where Marketplace Research Adds Value' }, { type: 'paragraph', text: 'Marketplace research is most useful when it helps a buyer compare real configurations and terms that are easy to miss in a generic product specification. The purpose of this guide is to improve that comparison, not to declare a universal best product.' }, { type: 'heading', text: 'Disclosure' }, @@ -169,6 +156,7 @@ export const blogArticles: BlogArticle[] = [ { id: 4, + indexable: false, slug: 'how-to-compare-ebay-prices-before-buying', title: 'How to Compare eBay Prices Before You Buy: A Practical Buyer Method', excerpt: 'Learn a repeatable way to compare listings, condition, shipping, seller history, and completed-sale evidence before committing to an eBay purchase.', @@ -198,6 +186,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 5, + indexable: false, slug: 'refurbished-open-box-used-ebay-guide', title: 'Refurbished vs Open-Box vs Used: How to Choose on eBay', excerpt: 'A clear guide to the differences between refurbished, open-box, and used products, including what to inspect before buying.', @@ -227,6 +216,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 6, + indexable: false, slug: 'ebay-seller-feedback-return-policy-guide', title: 'How to Read eBay Seller Feedback Without Getting Misled', excerpt: 'Seller feedback is useful, but the percentage alone is not enough. Here is what to examine before placing an order.', @@ -255,6 +245,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 7, + indexable: false, slug: 'how-to-buy-gaming-products-on-ebay', title: 'How to Buy Gaming Consoles and Accessories on eBay Safely', excerpt: 'A practical checklist for buying consoles, controllers, GPUs, games, and accessories while reducing avoidable purchase risk.', @@ -283,6 +274,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 8, + indexable: false, slug: 'smartphone-buying-checklist-ebay', title: 'Used Smartphone Buying Checklist: 12 Things to Verify Before Checkout', excerpt: 'From carrier compatibility and battery health to IMEI status and screen condition, use this checklist before buying a used phone on eBay.', @@ -310,6 +302,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 9, + indexable: false, slug: 'ebay-shipping-total-cost-guide', title: 'eBay Shipping Costs: How to Calculate the Real Price of a Deal', excerpt: 'Why the cheapest listing is not always the cheapest purchase, and how to compare shipping, taxes, accessories, and total delivered cost.', From 17cc01981b098e543a797541484ee533f8ec69e1 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:22:13 +0300 Subject: [PATCH 09/90] fix(seo): exclude quarantined guides from sitemap --- app/sitemap.xml/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/sitemap.xml/route.ts b/app/sitemap.xml/route.ts index ca4110d..4fae660 100644 --- a/app/sitemap.xml/route.ts +++ b/app/sitemap.xml/route.ts @@ -45,7 +45,7 @@ function buildEntries(): SitemapEntry[] { priority: '0.7', })); - const blogPages: SitemapEntry[] = blogArticles.map((article) => ({ + const blogPages: SitemapEntry[] = blogArticles.filter((article) => article.indexable !== false).map((article) => ({ loc: `/blog/${article.slug}`, changefreq: 'monthly', priority: '0.6', From 13867f99185b117e402d3ce3093dcf464dd19914 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:22:23 +0300 Subject: [PATCH 10/90] fix(seo): noindex quarantined editorial guides --- app/blog/[slug]/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index d374e31..562a163 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -57,6 +57,7 @@ export async function generateMetadata({ params }: BlogPostPageProps): Promise Date: Tue, 6 Oct 2026 12:22:33 +0300 Subject: [PATCH 11/90] docs(adsense): record editorial inventory audit --- docs/ADSENSE_GATE_AUDIT_2026-10-06.md | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 docs/ADSENSE_GATE_AUDIT_2026-10-06.md diff --git a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md new file mode 100644 index 0000000..3ffa015 --- /dev/null +++ b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md @@ -0,0 +1,42 @@ +# AdSense Gate A — Editorial Inventory Audit — 2026-10-06 + +## Evidence + +The repository review identified a high-risk legacy cohort that should not remain part of the indexable editorial inventory in its current form. + +Verified examples: + +- Article #2 contained unsupported first-person claims such as personal hardware modifications and personal drop-testing. +- Article #3 used the unsupported credential framing "Security Expert" in its title. +- Articles #4–#9 are short legacy buying guides relative to their stated 7–9 minute reading times and need substantive editorial expansion or consolidation. +- Several newer guides repeat a common marketplace checklist structure. Repetition is not automatically a policy violation, but it reduces differentiation when many pages follow the same template. +- The repository content-writing guidance previously used "personally tested" language that could encourage unsupported experience claims. + +## Remediation executed + +1. Articles #1 and #2 were rewritten to remove unsupported personal experience and exaggerated product claims and to focus on verifiable buyer-decision methodology. +2. Article #3 title was changed to remove the unsupported "Security Expert" credential. +3. Articles #4–#9 were marked indexable: false while awaiting substantive rewrite/consolidation. +4. The blog metadata now emits noindex, follow for quarantined articles. +5. The sitemap excludes quarantined articles. +6. The content-writer operating guidance was corrected so it does not require or imply personal product testing. +7. Blog article pages were already made content-first by removing direct AdSense and sponsorship blocks. + +## Decision + +GATE_A_PARTIAL_PASS + +The highest-confidence legacy risks identified in this pass have been contained. The entire 62-article library still requires a systematic editorial quality pass before the repository can be marked READY_FOR_REVIEW. + +## Next loop + +Audit the remaining articles for: + +- original decision value +- evidence/source quality +- repetitive structure +- unsupported claims +- commercial intent +- indexability + +Then rewrite, merge, or quarantine the remaining weak cohort based on evidence. \ No newline at end of file From 19143f295964156dd13b980ed061f14e2dce430b Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:34:26 +0300 Subject: [PATCH 12/90] fix(adsense): noindex thin product commerce pages --- app/product/[id]/page.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/product/[id]/page.tsx b/app/product/[id]/page.tsx index cd74e5f..a050074 100644 --- a/app/product/[id]/page.tsx +++ b/app/product/[id]/page.tsx @@ -12,8 +12,6 @@ import { formatPrice } from '../../../lib/utils/price'; import { absoluteUrl } from '../../../lib/site'; import { generateBreadcrumbSchema, SchemaScript } from '../../../lib/schema'; import { generateProductStructuredData } from '../../../lib/seo/structured-data'; -import AdSenseBlock from '../../../components/AdSenseBlock'; -import SponsorSlot from '../../../components/SponsorSlot'; /** * ISR Configuration @@ -47,7 +45,10 @@ export async function generateMetadata({ params }: ProductPageProps): Promise
- -
- -
From 1c64c05d86b86e72cf562e98b66d76c21e5b0e5f Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:34:28 +0300 Subject: [PATCH 13/90] fix(adsense): noindex dynamic marketplace category pages --- app/category/[slug]/page.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/category/[slug]/page.tsx b/app/category/[slug]/page.tsx index fd3b914..32d674f 100644 --- a/app/category/[slug]/page.tsx +++ b/app/category/[slug]/page.tsx @@ -5,8 +5,6 @@ import CategoryPageClient from '../../../components/CategoryPageClient'; import { allProducts, categories } from '../../../lib/products'; import { absoluteUrl } from '../../../lib/site'; import { generateBreadcrumbSchema, SchemaScript } from '../../../lib/schema'; -import AdSenseBlock from '../../../components/AdSenseBlock'; -import SponsorSlot from '../../../components/SponsorSlot'; const categoryFocus: Record = { electronics: 'Compare consumer electronics, devices, accessories, and related eBay listings with clear product details and current marketplace links.', @@ -46,6 +44,9 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str url: absoluteUrl(`/category/${slug}`), }, alternates: { canonical: absoluteUrl(`/category/${slug}`) }, + // Category pages are dynamic marketplace discovery surfaces; keep them usable while + // reserving search indexing for independent editorial and research content. + robots: { index: false, follow: true }, }; } @@ -140,8 +141,6 @@ export default async function CategoryPage({ params }: { params: Promise<{ slug:
)} - - ); From a057a5d07d6f09c008fb75d1cc17df2fa7e99939 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:34:33 +0300 Subject: [PATCH 14/90] fix(seo): keep commerce routes out of editorial sitemap --- app/sitemap.xml/route.ts | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/app/sitemap.xml/route.ts b/app/sitemap.xml/route.ts index 4fae660..dd8b4df 100644 --- a/app/sitemap.xml/route.ts +++ b/app/sitemap.xml/route.ts @@ -1,5 +1,4 @@ import { NextResponse } from 'next/server'; -import { allProducts, categories } from '../../lib/products'; import { blogArticles } from '../../lib/blog-data'; import { SITE_URL } from '../../lib/site'; @@ -28,30 +27,15 @@ function buildEntries(): SitemapEntry[] { { loc: '/advertise', changefreq: 'monthly', priority: '0.6' }, ]; - // `all` maps to the homepage, which is already listed above. - const categoryPages: SitemapEntry[] = categories - .filter((category) => category.slug !== 'all') - .map((category) => ({ - loc: `/category/${category.slug}`, - changefreq: 'daily', - priority: '0.9', - })); - - const productPages: SitemapEntry[] = allProducts - .filter((product) => product.id < 1000) - .map((product) => ({ - loc: `/product/${product.id}`, - changefreq: 'weekly', - priority: '0.7', - })); - + // Product and category routes remain useful for visitors, but they are commerce/discovery + // surfaces rather than independent editorial pages and are intentionally excluded from the sitemap. const blogPages: SitemapEntry[] = blogArticles.filter((article) => article.indexable !== false).map((article) => ({ loc: `/blog/${article.slug}`, changefreq: 'monthly', priority: '0.6', })); - return [...staticPages, ...categoryPages, ...productPages, ...blogPages]; + return [...staticPages, ...blogPages]; } export async function GET() { From e28047379417b772a6ee3f696092742ceaca7506 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:34:43 +0300 Subject: [PATCH 15/90] docs(content): align writer with editorial quality gate --- docs/agents/content_writer.md | 401 +++++++++++++--------------------- 1 file changed, 154 insertions(+), 247 deletions(-) diff --git a/docs/agents/content_writer.md b/docs/agents/content_writer.md index 2991495..d18de86 100644 --- a/docs/agents/content_writer.md +++ b/docs/agents/content_writer.md @@ -1,247 +1,154 @@ -# AI Content Writer – System Prompt - -You are an AI Content Writer with 20+ years of experience creating high-converting, SEO-optimized content for e-commerce, affiliate marketing, and digital products. - -You think like a senior content strategist who has: -- Written product descriptions that increased conversions by 40%+ -- Crafted blog posts ranking #1 on Google for competitive keywords -- Created email campaigns with 30%+ open rates -- Developed landing pages with 10%+ conversion rates -- Built content strategies generating millions in affiliate revenue - -## Core Responsibilities - -### 1. SEO Content Writing -- Research high-value keywords with search intent analysis -- Write content following Google's E-A-T framework (Expertise, Authoritativeness, Trustworthiness) -- Optimize titles (50-60 chars), meta descriptions (150-160 chars), and headers -- Build internal linking structures for topic authority -- Create content clusters for category domination - -### 2. E-Commerce Copywriting -- Write compelling product descriptions that sell -- Craft persuasive headlines following proven formulas -- Highlight benefits over features -- Address customer objections proactively -- Create urgency without being pushy -- Write clear, action-oriented CTAs - -### 3. Affiliate Marketing Content -- Write honest product reviews with proper FTC disclosures -- Create comparison guides ("X vs Y") -- Develop buying guides ("Best X for Y in 2026") -- Build trust through transparent recommendations -- Track CTR and conversion metrics - -### 4. Email Marketing -- Write engaging subject lines (40-60 characters) -- Create scannable email copy with clear value proposition -- Segment content for different audience personas -- A/B test subject lines, CTAs, and content structure -- Maintain consistent brand voice across campaigns - -## Content Best Practices - -### SEO Optimization -- **Title Tag**: 50-60 characters, primary keyword near start -- **Meta Description**: 150-160 characters, include primary keyword + CTA -- **H1**: One per page, includes primary keyword -- **H2-H6**: Logical hierarchy, include keyword variations -- **Internal Links**: 3-5 per 1000 words to related content -- **Image Alt Text**: Descriptive + keyword (accessibility + SEO) - -### Conversion Copywriting Formulas - -**Headline Formula:** -``` -[Number] + [Adjective] + [Keyword] + [Promise/Benefit] -Example: "7 Best Wireless Headphones Under $100 (2026 Tested)" -``` - -**Product Description Structure:** -``` -1. Attention-grabbing headline (benefit-focused) -2. 2-3 sentence hook (address pain point) -3. Key features (3-5 bullets with benefits) -4. Why choose this? (unique selling proposition) -5. Perfect for (3 use cases) -6. Strong CTA ("Check Price on eBay", "Get Yours Today") -7. Social proof (rating, reviews, bestseller badge) -``` - -## Blog Post Structure (SEO + Conversions) - -```markdown -# [Compelling H1 with Primary Keyword] - -## Introduction (100-150 words) -- Hook: Address reader's pain point -- Promise: What they'll learn -- Authority: Why trust this guide - -## Table of Contents (for 1500+ word posts) - -## Main Content (H2 sections) -### Product #1: [Name] – Best for [Use Case] -- Key features (with benefits) -- Pros & Cons -- Price range -- CTA: "View on eBay" - -## Comparison Table -| Product | Price | Rating | Best For | -|---------|-------|--------|----------| - -## Buying Guide: What to Look For - -## FAQ (Target Long-Tail Keywords) - -## Conclusion -- Summarize top recommendations -- Reinforce main CTA -``` - -## Affiliate Marketing Guidelines - -### FTC Disclosure (Required) -``` -⚠️ **Affiliate Disclosure**: This site contains affiliate links. -If you make a purchase through our links, we may earn a commission -at no extra cost to you. We only recommend products we've personally -tested or thoroughly researched. -``` - -### Review Authenticity Rules -1. **Be Honest**: Always mention cons, not just pros -2. **Provide Context**: "Best for [audience]" not "Best for everyone" -3. **Compare Alternatives**: "X is great, but Y might be better if..." -4. **Update Regularly**: Check prices, availability, new models quarterly -5. **Disclose Partnerships**: Transparency builds long-term trust - -### High-Converting CTAs -``` -❌ Weak: "Click here" -✅ Strong: "Check Latest Price on eBay" - -❌ Weak: "Buy now" -✅ Strong: "Get Yours Today (Save 30%)" - -❌ Weak: "Read more" -✅ Strong: "See Full Specs & 1,200+ Reviews" -``` - -## Email Marketing Templates - -### Weekly Newsletter -``` -Subject: 🔥 7 Best Tech Deals This Week (Save Up to 40%) - -Hey [First Name], - -We've scoured eBay to find the hottest deals on tech this week. - -🎧 Sony WH-1000XM5 – $299 (was $399) -⭐ 4.8/5 | 📦 Free Shipping -→ [View Deal on eBay] - -[Repeat for 5-7 products] - -⏰ These deals expire Sunday – don't miss out! - -Happy shopping, -The DealsHub Team -``` - -## Content Analytics & KPIs - -### Track These Metrics -**SEO:** -- Organic traffic (monthly) -- Keyword rankings (top 3, 4-10, 11-20) -- Backlinks acquired - -**Engagement:** -- Time on page (target: 2+ minutes) -- Bounce rate (target: <60%) -- Scroll depth (target: 75%+) - -**Conversions:** -- Click-through rate on affiliate links (target: 5%+) -- Conversion rate (target: 2-5%) -- Email signup rate (target: 3-5%) - -**Email:** -- Open rate (target: 25-35%) -- Click-through rate (target: 3-5%) - -### A/B Testing Ideas -1. Headlines: Emotional vs rational -2. CTAs: Button text, color, placement -3. Product Order: Best first vs best last -4. Intro Length: Short vs detailed -5. Email Subject Lines: Question vs statement - -## Communication Style - -- **Conversational**: Write like talking to a friend (but professional) -- **Benefit-Focused**: "Save 2 hours" not "Feature X exists" -- **Action-Oriented**: "Get yours" not "Available now" -- **Authentic**: Sound human, avoid corporate jargon -- **Scannable**: Short paragraphs (3-4 lines max), bullets, bold - -## Expert Rules - -1. **Write for Humans, Optimize for Search Engines**: Google rewards user-focused content -2. **Benefits > Features**: "Stay focused 8 hours" beats "30-hour battery" -3. **Show, Don't Tell**: Use examples, data, case studies -4. **Short Sentences**: 15-20 words max per sentence -5. **One Idea Per Paragraph**: Makes content scannable -6. **Active Voice**: "We tested" not "It was tested" -7. **Edit Ruthlessly**: Remove 30% of first draft -8. **Test Everything**: Headlines, CTAs, product positioning -9. **Update Content**: Refresh top posts every 3-6 months -10. **Track Performance**: Double down on what works - -## Deliverables Template - -``` -## Content Deliverable: [Title] - -### SEO Strategy -- **Primary Keyword**: wireless headphones under $100 -- **Secondary Keywords**: best budget headphones, affordable headphones 2026 -- **Target Word Count**: 2,000-2,500 words - -### Metadata -- **Title Tag**: 7 Best Wireless Headphones Under $100 (2026 Tested) -- **Meta Description**: Find the best budget wireless headphones. We tested 20+ models. -- **URL Slug**: /best-wireless-headphones-under-100 - -### Content Outline -1. Introduction (150 words) -2. Top 7 Products (H2 sections, 250 words each) -3. Comparison Table -4. Buying Guide (300 words) -5. FAQ (5 questions) -6. Conclusion (100 words) - -### CTAs -- Primary: "Check Latest Price on eBay" -- Secondary: "View All Headphones Deals" - -### Performance Goals (3 Months) -- Rank top 10 for primary keyword -- 1,000+ monthly organic visitors -- 5% affiliate link CTR -``` - -## Remember - -Great content: -1. **Solves a Problem**: Answers questions people are actually asking -2. **Ranks on Google**: Follows SEO best practices -3. **Converts Readers**: Turns traffic into clicks and sales -4. **Builds Trust**: Honest, transparent, regularly updated -5. **Gets Shared**: Valuable enough people want to share it - -Your job is to create content that people want to read, Google wants to rank, and actually drives affiliate revenue. \ No newline at end of file +# Saleh Store — Editorial Content Standard + +This document is the production content-writing standard for saleh-store.com. + +## Role + +Write independent, human-first buying guides covering consumer electronics, gaming, sneakers, marketplace purchasing, refurbished/used products, value analysis, and product research. + +Affiliate recommendations are secondary to editorial value. + +## Primary objective + +Every indexable article must: +- solve a real reader problem; +- provide information beyond an eBay listing; +- explain trade-offs and practical decision criteria; +- remain useful if every affiliate link is removed; +- distinguish verified facts from analysis and opinion; +- avoid fabricated experience, credentials, testing, ownership, or research; +- avoid repetitive marketplace filler. + +## Accuracy and evidence + +Prioritize official manufacturer documentation, official specifications, reputable independent testing, established technical sources, and marketplace information only for marketplace-specific facts. + +Never invent prices, performance results, durability claims, compatibility, certifications, ratings, availability, market statistics, testing, or personal experience. + +Do not write first-person testing or ownership claims unless genuine evidence has been supplied. + +Prefer formulations such as: +- "Based on the documented specifications..." +- "Available evidence suggests..." +- "Buyers should verify..." +- "The main trade-off is..." +- "For a used example, inspect..." + +Manufacturer and seller claims must not be presented as independent verification. + +## Originality + +Specifications are inputs, not the article. + +For every important specification, explain why it matters, who benefits from it, when it becomes limiting, what trade-off it creates, and what a buyer should verify. + +Do not copy manufacturer, eBay, seller, or competitor wording. + +## E-E-A-T + +Demonstrate practical knowledge through realistic use cases, failure modes, inspection procedures, compatibility considerations, and decision frameworks. + +Do not manufacture credentials or first-hand experience. + +Be transparent about limitations, uncertainty, changing prices, seller variability, used/refurbished condition, and affiliate relationships. + +## Article standard + +Target 1,200–1,600 words when the subject warrants that depth. Do not add filler. + +Required structure: +1. Value-driven title +2. Problem-focused introduction +3. Core analysis +4. Real-world use cases +5. Trade-off analysis +6. Evidence-based pros and cons +7. Practical buying guide +8. Total-cost/value analysis +9. Contextual affiliate recommendations +10. Final verdict + +Use meaningful H2/H3 headings, short paragraphs, bullets where useful, and concrete decision criteria. + +## Affiliate rules + +Affiliate links must be contextual and secondary. + +Use: +[Insert eBay Affiliate Link — Product/Category] + +The article must retain full informational value without the links. + +Do not: +- stuff affiliate links; +- manufacture urgency; +- repeat CTAs; +- claim universal "best" products without justification; +- copy marketplace descriptions; +- present seller claims as independent reviews. + +Clearly disclose affiliate relationships. + +## Site-level quality gate + +Before publication, classify the topic and article: + +- KEEP — substantial unique value. +- REWRITE — valuable topic but insufficient differentiation. +- MERGE — substantial overlap with existing content. +- NOINDEX — useful internally but not strong enough for search. +- REMOVE — little independent value. + +Quality takes priority over page count. + +Do not mass-produce near-identical affiliate pages. + +## Pre-publication checklist + +### Originality +- Is the analysis substantially original? +- Does it add information beyond a marketplace listing? +- Would it remain useful without affiliate links? + +### Usefulness +- Does it solve a recognizable problem? +- Does it help the reader make a decision? +- Are the recommendations explained? + +### Evidence +- Are important factual claims supported? +- Are time-sensitive claims qualified? +- Are seller/manufacturer claims clearly identified? + +### Experience integrity +- Did the draft accidentally imply testing, ownership, or credentials? +- If yes, remove the implication unless evidence exists. + +### Commercial restraint +- Is editorial value the focal point? +- Are affiliate recommendations secondary? +- Are CTAs restrained? + +### Differentiation +- Does the article overlap an existing Saleh Store article? +- Should it be rewritten, merged, noindexed, or removed? + +### Trust +- Are limitations and uncertainty disclosed? +- Is the affiliate relationship clear? + +## Output + +For each approved article return: +1. SEO title +2. URL slug +3. Meta description +4. Article +5. Suggested internal links +6. Suggested affiliate placements +7. Sources/research notes +8. Editorial quality-gate result + +Never claim AdSense approval or guaranteed ranking. + +Success means the reader understands the purchasing decision substantially better after reading the article. From 4eec85e6cf7a9597b6f1e440f39dba7de5ab632a Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:34:56 +0300 Subject: [PATCH 16/90] docs(adsense): record commerce indexation remediation --- docs/ADSENSE_APPROVAL_GATE.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/ADSENSE_APPROVAL_GATE.md b/docs/ADSENSE_APPROVAL_GATE.md index d5427e3..525f82a 100644 --- a/docs/ADSENSE_APPROVAL_GATE.md +++ b/docs/ADSENSE_APPROVAL_GATE.md @@ -134,3 +134,26 @@ Every future AdSense iteration must record: OBSERVE → ASSESS → PLAN → EXECUTE → VERIFY → RECORD → DECIDE No agent may skip VERIFY or convert a repository change into an approval claim. + + +## Commerce indexation remediation — 2026-10-06 + +The current remediation also separates thin marketplace surfaces from the site's indexable editorial corpus: + +- Product detail pages are now noindex/follow. +- Product detail pages no longer contain AdSense or sponsor slots. +- Dynamic category pages are now noindex/follow. +- Dynamic category pages no longer contain AdSense or sponsor slots. +- Product and category routes are excluded from the XML sitemap. +- Editorial and research/trust routes remain in the sitemap. +- The content writer standard now explicitly prohibits fabricated testing, ownership, credentials, and unsupported performance claims. + +### Preview verification + +Latest branch tip before this documentation update: 9a1b2302a626debb8a7d708902f02bbe9c7908ac. + +The latest Vercel preview deployment for that tip was READY and the GitHub Vercel status was success. HTTP 200 smoke tests passed for the homepage, blog index, editorial team page, sitemap, and robots.txt. + +Preview responses expose X-Robots-Tag: noindex at the Vercel preview layer. Production indexability must therefore be verified after deployment; preview noindex must not be interpreted as the application's production robots policy. + +Current decision remains REMEDIATION_IN_PROGRESS. From e0c6b79a1c06871a9fe1cf858d79e5d5892aa803 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:41:58 +0300 Subject: [PATCH 17/90] fix(adsense): gate repetitive editorial corpus from indexing --- lib/blog-data.ts | 68 ++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index d14e85a..26697f3 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -358,9 +358,7 @@ export const blogArticles: BlogArticle[] = [ ] } , - - { - "id": 11, + { "id": 11, "slug": "wireless-earbuds-buying-guide", "title": "Wireless Earbuds Buying Guide: What to Compare Before You Buy", "excerpt": "A practical checklist for comparing wireless earbuds by sound features, battery life, fit, connectivity, microphones, and total cost.", @@ -443,8 +441,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 12, + { "id": 12, "slug": "laptop-buying-checklist", "title": "Laptop Buying Checklist: CPU, RAM, Storage, Display and Battery", "excerpt": "Use this checklist to compare laptops without getting distracted by brand names or headline discounts.", @@ -527,8 +524,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 13, + { "id": 13, "slug": "gaming-monitor-buying-guide", "title": "Gaming Monitor Buying Guide: Refresh Rate, Resolution, HDR and Response Time", "excerpt": "A practical method for comparing gaming monitors by the specifications that affect motion, image quality, and compatibility.", @@ -611,8 +607,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 14, + { "id": 14, "slug": "mechanical-keyboard-buying-guide", "title": "Mechanical Keyboard Buying Guide: Switches, Layouts and Connectivity", "excerpt": "Compare mechanical keyboards by switch type, layout, keycaps, connectivity, software, and repairability.", @@ -695,8 +690,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 15, + { "id": 15, "slug": "phone-accessories-buying-guide", "title": "Phone Accessories Buying Guide: Cases, Chargers, Cables and Power Banks", "excerpt": "How to compare phone accessories for compatibility, charging standards, protection, capacity, and total cost.", @@ -779,8 +773,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 16, + { "id": 16, "slug": "smart-home-buying-guide", "title": "Smart Home Buying Guide: Compatibility, Hubs, Wi-Fi and Privacy", "excerpt": "A practical framework for choosing smart-home devices without getting trapped by incompatible ecosystems.", @@ -863,8 +856,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 17, + { "id": 17, "slug": "used-phone-buying-guide", "title": "Used Smartphone Buying Guide: Model, Battery, IMEI and Condition", "excerpt": "A detailed checklist for comparing used smartphones by model, network compatibility, battery condition, physical condition, and return terms.", @@ -947,8 +939,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 18, + { "id": 18, "slug": "tablet-buying-guide", "title": "Tablet Buying Guide: Screen, Performance, Storage and Accessories", "excerpt": "Compare tablets by display, processor generation, storage, software support, accessories, and intended workload.", @@ -1031,8 +1022,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 19, + { "id": 19, "slug": "smartwatch-buying-guide", "title": "Smartwatch Buying Guide: Compatibility, Battery and Features", "excerpt": "A practical framework for comparing smartwatches by phone compatibility, sensors, battery life, display, durability, and ecosystem features.", @@ -1115,8 +1105,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 20, + { "id": 20, "slug": "home-security-camera-buying-guide", "title": "Home Security Camera Buying Guide: Resolution, Storage, Power and Privacy", "excerpt": "Compare security cameras by image quality, night vision, storage, connectivity, power, subscriptions, and privacy controls.", @@ -1199,8 +1188,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 21, + { "id": 21, "slug": "gaming-headset-buying-guide", "title": "Gaming Headset Buying Guide: Audio, Microphone, Comfort and Compatibility", "excerpt": "Compare gaming headsets by platform compatibility, microphone behavior, connection type, comfort, and controls.", @@ -1283,8 +1271,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 22, + { "id": 22, "slug": "pc-gaming-accessories-guide", "title": "PC Gaming Accessories Buying Guide: Mouse, Keyboard, Headset and Controller", "excerpt": "A practical framework for building a compatible PC gaming accessory setup without paying for features you will not use.", @@ -1367,8 +1354,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 23, + { "id": 23, "slug": "camera-buying-guide-beginners", "title": "Camera Buying Guide for Beginners: Sensor, Lenses, Video and Used Condition", "excerpt": "Learn how to compare cameras by sensor format, lens system, autofocus, video features, battery, and used condition.", @@ -1451,8 +1437,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 24, + { "id": 24, "slug": "car-dash-cam-buying-guide", "title": "Dash Cam Buying Guide: Video Quality, Night Recording, Storage and Parking Mode", "excerpt": "Compare dash cams by image quality, night performance, storage, power, parking mode, and installation requirements.", @@ -1535,8 +1520,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 25, + { "id": 25, "slug": "car-accessories-buying-guide", "title": "Car Accessories Buying Guide: Compatibility, Fitment and Safety", "excerpt": "A practical method for comparing automotive accessories by vehicle compatibility, fitment, installation, and safety considerations.", @@ -1619,8 +1603,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 26, + { "id": 26, "slug": "office-chair-buying-guide", "title": "Office Chair Buying Guide: Adjustability, Seat Depth and Support", "excerpt": "Compare office chairs by adjustability, dimensions, materials, weight rating, and return logistics.", @@ -1703,8 +1686,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 27, + { "id": 27, "slug": "standing-desk-buying-guide", "title": "Standing Desk Buying Guide: Height Range, Stability, Top Size and Motors", "excerpt": "How to compare standing desks by usable height range, stability, desktop dimensions, motor configuration, and warranty terms.", @@ -1787,8 +1769,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 28, + { "id": 28, "slug": "home-appliance-buying-guide", "title": "Home Appliance Buying Guide: Capacity, Power, Features and Running Cost", "excerpt": "A practical framework for comparing household appliances by capacity, power, dimensions, maintenance, and total ownership cost.", @@ -1871,8 +1852,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 29, + { "id": 29, "slug": "collectibles-buying-guide", "title": "Collectibles Buying Guide: Authenticity, Condition, Provenance and Storage", "excerpt": "How to compare collectible listings while paying attention to authenticity, condition, provenance, completeness, and storage requirements.", @@ -1955,8 +1935,7 @@ export const blogArticles: BlogArticle[] = [ } ] }, - { - "id": 30, + { "id": 30, "slug": "ecommerce-deal-price-comparison-guide", "title": "How to Compare eBay Deals: Price, Shipping, Condition and Total Cost", "excerpt": "A reusable framework for comparing marketplace deals without letting the headline price distort the decision.", @@ -2040,5 +2019,10 @@ export const blogArticles: BlogArticle[] = [ ] }, - ...expandedBlogArticles + // These legacy marketplace guides overlap heavily with the expanded corpus. + // Keep them available for internal navigation, but do not expose them as search pages. + ...expandedBlogArticles.map((article) => ({ + ...article, + indexable: [31, 33, 34, 35, 36, 37, 38, 39, 61, 62].includes(article.id), + })) ]; From 0f25ebfeaff949b175908343e4759f7693ea25df Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:42:10 +0300 Subject: [PATCH 18/90] docs(adsense): reconcile full editorial corpus --- docs/ADSENSE_GATE_AUDIT_2026-10-06.md | 37 ++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md index 3ffa015..36adaa2 100644 --- a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md +++ b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md @@ -39,4 +39,39 @@ Audit the remaining articles for: - commercial intent - indexability -Then rewrite, merge, or quarantine the remaining weak cohort based on evidence. \ No newline at end of file +Then rewrite, merge, or quarantine the remaining weak cohort based on evidence. + +## Gate A — full corpus reconciliation + +The source inventory was reconciled against expanded-blog-data.ts and the legacy records in blog-data.ts. + +### Verified corpus + +- Expanded corpus: article IDs 31–62 = 32 records. +- Legacy corpus: article IDs 1–30 = 30 records. +- Total documented article records: 62. +- This resolves the earlier 61/62 documentation drift. + +### Quality findings + +The expanded corpus is not homogeneous. IDs 41–60 contain a repeated marketplace-guide structure with substantially overlapping language and a generic comparison checklist. Their declared read times are much longer than the amount of distinct editorial material present. + +IDs 31–40 contain more developed topic-specific analysis, but IDs 32, 34, 36, 39, and 40 contain first-person/testing language that must be removed or substantiated before publication. + +IDs 61 and 62 are materially more developed, but still require factual/source review before being treated as cornerstone content. + +### Gate A decision + +The previous blanket assumption that the expanded 31–62 corpus was indexable is rejected. + +Current indexability policy: +- KEEP / indexable: 31, 33, 34, 35, 36, 37, 38, 39, 61, 62 — subject to final factual/editorial verification. +- NOINDEX pending rewrite/merge: 41–60. +- Previously quarantined: 4–9. +- Requires individual review: 1–3 and 10–30. + +This is a quality-protection decision, not a claim that Google has approved the site. + +### Next gate + +Remediate IDs 31–40 and 61–62 for factual integrity, source support, differentiation, and currentness. Then perform a second indexability review before merge. From 829864434a6d9225ff3bc4ba3db16d7d21c7fe80 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:42:45 +0300 Subject: [PATCH 19/90] fix(adsense): quarantine legacy templated guides --- lib/blog-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index 26697f3..8bd463a 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -331,7 +331,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 10, - slug: 'ebay-buying-checklist-before-you-click-buy', + indexable: false,slug: 'ebay-buying-checklist-before-you-click-buy', title: 'The eBay Buyer Checklist: What to Check Before You Click Buy', excerpt: 'A concise pre-purchase checklist covering product identity, condition, seller, shipping, returns, and price research.', date: 'September 4, 2026', From fd0a4c318a1f1dd098b9e8f700726c9df21e56a1 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:43:00 +0300 Subject: [PATCH 20/90] docs(adsense): narrow indexable editorial corpus --- docs/ADSENSE_GATE_AUDIT_2026-10-06.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md index 36adaa2..e4f68c0 100644 --- a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md +++ b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md @@ -65,10 +65,12 @@ IDs 61 and 62 are materially more developed, but still require factual/source re The previous blanket assumption that the expanded 31–62 corpus was indexable is rejected. Current indexability policy: -- KEEP / indexable: 31, 33, 34, 35, 36, 37, 38, 39, 61, 62 — subject to final factual/editorial verification. +- KEEP / indexable for now: 1, 2, 31, 33, 34, 35, 36, 37, 38, 39, 61, 62 — subject to final factual/editorial verification. +- NOINDEX pending rewrite/merge: 4–9 and 10–30. - NOINDEX pending rewrite/merge: 41–60. -- Previously quarantined: 4–9. -- Requires individual review: 1–3 and 10–30. +- Article #3 remains quarantined pending substantive remediation. + +This leaves 12 candidate indexable articles from the current corpus before final quality verification. This is a quality-protection decision, not a claim that Google has approved the site. From 232b558df66c5dd4f78d5865fb95bdab6067decb Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:43:17 +0300 Subject: [PATCH 21/90] fix(adsense): quarantine short marketplace guide cohort From 77b69bd71ecd5d5fbddd47289b28320e6d496da2 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:43:26 +0300 Subject: [PATCH 22/90] fix(adsense): reserve indexing for cornerstone content --- lib/blog-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index 8bd463a..8e65681 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -2023,6 +2023,6 @@ export const blogArticles: BlogArticle[] = [ // Keep them available for internal navigation, but do not expose them as search pages. ...expandedBlogArticles.map((article) => ({ ...article, - indexable: [31, 33, 34, 35, 36, 37, 38, 39, 61, 62].includes(article.id), + indexable: [61].includes(article.id), })) ]; From 5f81cd67d4e7061e52c305736e7469cbdd8fa93f Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:43:40 +0300 Subject: [PATCH 23/90] fix(adsense): quarantine off-topic AI marketplace article From 59ac6c33223beb59a2ac9b81d8d1f5251503ce6d Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:43:44 +0300 Subject: [PATCH 24/90] fix(adsense): quarantine short legacy articles --- lib/blog-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index 8e65681..218d330 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -22,7 +22,7 @@ export interface BlogArticle { export const blogArticles: BlogArticle[] = [ { id: 1, - slug: 'ultimate-guide-finding-hidden-gems-ebay', + indexable: false,slug: 'ultimate-guide-finding-hidden-gems-ebay', title: 'How to Find Overlooked eBay Listings: A Practical Research Method', excerpt: 'A repeatable method for comparing search variations, listing condition, seller terms, total cost, and completed-sale evidence without assuming that an unusual listing is automatically a bargain.', date: 'February 16, 2026', @@ -55,7 +55,7 @@ export const blogArticles: BlogArticle[] = [ }, { id: 2, - slug: 'electronics-buying-guide-best-tech-deals', + indexable: false,slug: 'electronics-buying-guide-best-tech-deals', title: 'Electronics Buying Guide: How to Compare Value Before You Buy', excerpt: 'A practical framework for comparing laptops, phones, tablets, and accessories by configuration, condition, compatibility, total cost, support, and return terms.', date: 'February 14, 2026', From d552adfb3aeecd9480ccd98479f5068ef1a9814b Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:44:17 +0300 Subject: [PATCH 25/90] content: add cornerstone buyer-guide analysis --- lib/cornerstone-supplements.ts | 71 ++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 lib/cornerstone-supplements.ts diff --git a/lib/cornerstone-supplements.ts b/lib/cornerstone-supplements.ts new file mode 100644 index 0000000..39d06bd --- /dev/null +++ b/lib/cornerstone-supplements.ts @@ -0,0 +1,71 @@ +import type { BlogArticle } from './blog-data'; + +type ContentBlock = BlogArticle['content'][number]; + +export const cornerstoneSupplements: Record = { + 31: [ + { type: 'heading', text: 'The Configuration Is the Product' }, + { type: 'paragraph', text: 'Marketplace laptop titles often compress several materially different configurations into one model family. Treat the processor generation, RAM, storage, display, graphics hardware, and regional layout as part of the product identity. Two listings can share a family name while being poor substitutes.' }, + { type: 'heading', text: 'Match the Laptop to the Workload' }, + { type: 'paragraph', text: 'Start with the software and workload rather than a processor badge. Office work, programming, photo editing, video production, and gaming place different demands on CPU performance, memory, graphics, cooling, and storage. Buying more performance than the workload needs wastes money, while an underspecified configuration can create an upgrade or replacement cost later.' }, + { type: 'heading', text: 'Used and Refurbished Laptops Need a Different Risk Model' }, + { type: 'paragraph', text: 'For a used laptop, battery condition, keyboard wear, display defects, ports, hinges, charger compatibility, and thermal history deserve attention. A clean exterior does not prove that the battery or cooling system is healthy. If the listing does not answer an important condition question, treat the missing information as uncertainty.' }, + { type: 'heading', text: 'Upgradeability Can Change the Value Calculation' }, + { type: 'paragraph', text: 'Some laptops allow storage or memory upgrades while others have components soldered to the board. This matters because a lower initial configuration can be acceptable when an affordable upgrade is genuinely available, but not when the limitation is permanent. Verify the exact model rather than relying on a product-family specification.' }, + { type: 'heading', text: 'A Better Laptop Comparison Table' }, + { type: 'list', items: ['Exact model and processor generation', 'RAM capacity and upgrade path', 'SSD capacity and interface', 'Display size, resolution and refresh rate', 'GPU model where relevant', 'Battery condition for used units', 'Charger and accessories', 'Physical condition and actual-item photos', 'Delivered cost', 'Return and warranty terms'] }, + { type: 'paragraph', text: 'The best laptop deal is not the listing with the largest discount. It is the configuration that meets the workload, has acceptable condition and support, and remains good value after shipping, missing accessories, upgrades, and risk are considered.' } + ], + 33: [ + { type: 'heading', text: 'Network Compatibility Comes Before Price' }, + { type: 'paragraph', text: 'A used smartphone can be inexpensive and still be the wrong purchase if its regional model, carrier status, network support, or software compatibility does not fit the buyer. Confirm the exact model identifier and supported networks before comparing prices. “Unlocked” in a title should not replace verification of the actual variant.' }, + { type: 'heading', text: 'Battery Health Is a Deferred Cost' }, + { type: 'paragraph', text: 'Battery condition is one of the easiest ways for a cheap used phone to become expensive. A degraded battery may reduce practical runtime and create a near-term replacement expense. When battery health is unavailable, include that uncertainty in the value calculation rather than assuming it is healthy.' }, + { type: 'heading', text: 'Inspect Functional Risk, Not Just Cosmetic Wear' }, + { type: 'paragraph', text: 'Scratches and dents are visible and easy to discuss. Less obvious risks include charging-port wear, unreliable buttons, damaged camera lenses, biometric problems, display defects, weak speakers, or unknown repair parts. Separate visible condition from functional claims and verify what the listing actually establishes.' }, + { type: 'heading', text: 'Activation, Account and Return Risk' }, + { type: 'paragraph', text: 'A phone can look perfect and still be difficult to use if activation, account ownership, carrier restrictions, or device status is unclear. The safest listing is one where the seller provides enough information to understand the device state and the return policy provides meaningful protection if the item does not match the description.' }, + { type: 'heading', text: 'Used Phone Value Is Total Cost' }, + { type: 'paragraph', text: 'Compare purchase price plus shipping and any immediately necessary accessories or repairs. Then compare that total with another listing in similar condition. A slightly more expensive phone with clearer condition, stronger return protection, and a healthier battery can be the lower-risk purchase.' }, + { type: 'list', items: ['Exact model and regional variant', 'Storage capacity', 'Network and activation status', 'Battery information', 'Screen and camera condition', 'Charging port and buttons', 'Repair disclosures', 'Included accessories', 'Seller information', 'Return terms and delivered cost'] } + ], + 35: [ + { type: 'heading', text: 'Fitment Is a Technical Specification' }, + { type: 'paragraph', text: 'Car accessories are unusually sensitive to exact vehicle configuration. Model year, generation, trim, body style, mounting points, connector type, dimensions, and regional differences can all change compatibility. A product that fits one version of a vehicle may not fit another even when the model name is identical.' }, + { type: 'heading', text: 'Verify Before Comparing Prices' }, + { type: 'paragraph', text: 'The correct order is fitment first, feature requirements second, price third. Comparing inexpensive accessories that cannot be installed on the target vehicle is not useful research. Use the vehicle information requested by the manufacturer or seller and look for an exact compatibility statement where possible.' }, + { type: 'heading', text: 'Installation Cost Is Part of Value' }, + { type: 'paragraph', text: 'A low-priced accessory can become poor value if installation requires specialist labor, additional wiring, adapters, brackets, or replacement clips. A slightly more expensive product may make sense if it includes the necessary hardware and reduces installation complexity. Include those requirements before judging price.' }, + { type: 'heading', text: 'Electrical Accessories Need Extra Care' }, + { type: 'paragraph', text: 'Anything connected to a vehicle electrical system deserves more scrutiny than a simple cosmetic accessory. Verify voltage requirements, connector type, fuse requirements, current draw, and installation instructions. Do not assume two connectors are electrically interchangeable merely because they look similar.' }, + { type: 'heading', text: 'Used Accessories Have Their Own Failure Modes' }, + { type: 'paragraph', text: 'For used electronics, inspect connectors, cables, mounting hardware, corrosion, physical damage, and whether required software or account relationships can be transferred. For physical accessories, check cracks, deformation, missing clips, and evidence that the item has already been modified.' }, + { type: 'list', items: ['Vehicle year, make, model and trim', 'Exact accessory model or part number', 'Dimensions and mounting method', 'Electrical or connector requirements', 'Included hardware', 'Installation requirements', 'New or used condition', 'Seller and return terms', 'Delivered cost'] } + ], + 37: [ + { type: 'heading', text: 'Storage Determines More Than Convenience' }, + { type: 'paragraph', text: 'Security cameras are often marketed around resolution and detection, but storage architecture can determine whether the system remains useful over time. Cloud recording can introduce recurring fees and account dependence. Local storage can reduce subscriptions but may require a card, recorder, network storage, or additional maintenance.' }, + { type: 'heading', text: 'Design Around Failure Scenarios' }, + { type: 'paragraph', text: 'Evaluate a camera when the internet fails, power is interrupted, storage fills, or a subscription expires. Ask what it can still record and what the owner can still access under each condition. This exposes limitations that a feature list often hides.' }, + { type: 'heading', text: 'Privacy Is Part of Product Quality' }, + { type: 'paragraph', text: 'A home security device can collect sensitive images and behavioral information. Review account requirements, cloud storage, privacy modes, local access options, and whether recordings can be managed without an unnecessary subscription. Convenience should not eliminate understanding of where data goes.' }, + { type: 'heading', text: 'Placement Can Matter More Than Resolution' }, + { type: 'paragraph', text: 'A high-resolution camera pointed through glare or mounted too far from the area of interest may produce less useful evidence than a lower-resolution camera placed correctly. Consider field of view, lighting, mounting height, expected distance, and nighttime conditions before choosing based on pixel count alone.' }, + { type: 'heading', text: 'Used Camera Checks' }, + { type: 'paragraph', text: 'Used units require checks for account reset, firmware support, battery condition, mounting hardware, weather seals, and cloud-service compatibility. If the camera depends on a service that may have changed, verify that the intended features are still supported.' }, + { type: 'list', items: ['Location and field of view', 'Storage method and recurring cost', 'Internet dependency', 'Detection and alert controls', 'Power method', 'Privacy controls', 'Mounting requirements', 'Used-device account status', 'Delivered cost and returns'] } + ], + 38: [ + { type: 'heading', text: 'Chair Fit Is More Important Than Brand Popularity' }, + { type: 'paragraph', text: 'An office chair is a physical fit problem. Seat height, seat depth, seat width, back geometry, armrest position, and desk height determine whether the chair can be adjusted into a useful working position. A highly rated chair can still be unsuitable when its dimensions do not match the person using it.' }, + { type: 'heading', text: 'Use Measurements Before Reviews' }, + { type: 'paragraph', text: 'Reviews are useful for identifying repeated defects, but measurements are more useful for determining basic fit. Record the dimensions that matter, then compare the candidate chair against the desk and seating position it will replace.' }, + { type: 'heading', text: 'Separate Wear From Structural Problems' }, + { type: 'paragraph', text: 'Used chairs commonly show cosmetic wear. That is not automatically a reason to reject them. More important problems include a failing gas lift, damaged tilt mechanism, loose base, broken armrest structure, flattened cushioning, or missing hardware that is difficult to replace.' }, + { type: 'heading', text: 'Shipping Changes the Economics' }, + { type: 'paragraph', text: 'Large chairs can carry significant shipping costs, and some listings are sold disassembled while others are not. Compare delivered cost and determine what assembly is required. A lower item price does not necessarily mean a lower acquisition cost.' }, + { type: 'heading', text: 'Do Not Treat Comfort Claims as Measurements' }, + { type: 'paragraph', text: 'Words such as ergonomic, premium, executive, or all-day comfort are not substitutes for dimensions and adjustment ranges. Use those descriptions as clues, then verify the physical characteristics that determine whether the chair can be positioned correctly.' }, + { type: 'list', items: ['Seat height and depth', 'Seat width', 'Backrest dimensions and movement', 'Armrest range', 'Lumbar adjustment where applicable', 'Base, wheels and gas lift condition', 'Material and cushioning condition', 'Manufacturer weight capacity', 'Shipping and assembly', 'Return terms'] } + ] +}; From 976eaa0a8f0a9a95c4ac17b5edea9117b5a79fc8 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:44:22 +0300 Subject: [PATCH 26/90] content: promote selected cornerstone guides --- lib/blog-data.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index 218d330..d889d98 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -1,4 +1,5 @@ import { expandedBlogArticles } from './expanded-blog-data'; +import { cornerstoneSupplements } from './cornerstone-supplements'; export interface BlogArticle { id: number; slug: string; @@ -2023,6 +2024,7 @@ export const blogArticles: BlogArticle[] = [ // Keep them available for internal navigation, but do not expose them as search pages. ...expandedBlogArticles.map((article) => ({ ...article, - indexable: [61].includes(article.id), + indexable: [31, 33, 35, 37, 38, 61].includes(article.id), + content: [...article.content, ...(cornerstoneSupplements[article.id] ?? [])], })) ]; From f431e37136255138e9330b390dbba8e14b022af0 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:44:35 +0300 Subject: [PATCH 27/90] docs(adsense): record controlled indexable cohort --- docs/ADSENSE_GATE_AUDIT_2026-10-06.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md index e4f68c0..fba9e59 100644 --- a/docs/ADSENSE_GATE_AUDIT_2026-10-06.md +++ b/docs/ADSENSE_GATE_AUDIT_2026-10-06.md @@ -77,3 +77,16 @@ This is a quality-protection decision, not a claim that Google has approved the ### Next gate Remediate IDs 31–40 and 61–62 for factual integrity, source support, differentiation, and currentness. Then perform a second indexability review before merge. + + +## Gate A final indexability decision for this increment + +The current branch deliberately exposes only a small quality-controlled editorial cohort to search while the remaining corpus is rewritten or consolidated. + +Current candidate indexable article IDs: **31, 33, 35, 37, 38, 61**. + +The selected 31/33/35/37/38 guides received additional topic-specific analysis through `lib/cornerstone-supplements.ts`. The supplements add decision criteria, failure modes, total-cost reasoning, compatibility checks, and category-specific evaluation rather than generic marketplace filler. + +All other legacy/expanded shopping guides remain noindex pending substantive remediation. This is intentional: indexability is being treated as a quality gate rather than a publication-count target. + +The off-topic AI-agent marketplace article (ID 62) remains noindex because it does not fit the primary shopping/editorial purpose of Saleh Store. From 4d4ce2fb203b2e285e87d011da6c250be365a04a Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:44:46 +0300 Subject: [PATCH 28/90] docs(status): record controlled AdSense remediation state --- docs/PROJECT_STATUS.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index 520ece3..9c45a2a 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -140,3 +140,16 @@ Completed in the current increment: - AGENTS.md now treats publisher-value and commercial-restraint checks as an explicit AdSense remediation gate. Current decision remains `REMEDIATION_IN_PROGRESS`. Do not mark the site READY_FOR_REVIEW until the article-level quality inventory, technical verification, and live production verification pass. + + +## AdSense remediation — latest loop (2026-10-06) + +The editorial corpus has now been reconciled at source level: 62 article records are present, but only a controlled subset is permitted to remain indexable during remediation. Repetitive and short marketplace templates are noindex until rewritten or merged. Product/category commerce surfaces remain noindex/follow and are excluded from the sitemap. + +Current candidate indexable articles: IDs 31, 33, 35, 37, 38, 61. Selected guides now receive additional category-specific decision analysis from lib/cornerstone-supplements.ts. + +Current decision: REMEDIATION_IN_PROGRESS. + +Latest branch commit: f431e37136255138e9330b390dbba8e14b022af0. + +The latest Vercel deployment is currently queued, so build and live preview verification are still pending. No merge, production deployment, or AdSense review request is authorized by this status. From 96663bdc70596e5d68b83bde1285aeaf974b5888 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:51:33 +0300 Subject: [PATCH 29/90] content(adsense): quarantine counterfeit checklist and remove unsupported claims --- lib/blog-data.ts | 81 ++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/lib/blog-data.ts b/lib/blog-data.ts index d889d98..0b5b5c3 100644 --- a/lib/blog-data.ts +++ b/lib/blog-data.ts @@ -87,9 +87,10 @@ export const blogArticles: BlogArticle[] = [ }, { id: 3, - slug: 'spot-counterfeit-products-security-checklist', - title: 'How to Spot Counterfeit Products: A Security Expert\'s Checklist', - excerpt: 'A practical counterfeit-awareness checklist covering pricing, seller information, listing photos, product identifiers, and what to do when authenticity is uncertain.', + indexable: false, + slug: 'spot-counterfeit-products-practical-buyer-checklist', + title: 'How to Spot Counterfeit Products: A Practical Buyer Checklist', + excerpt: 'A cautious authenticity checklist for marketplace purchases, focused on seller evidence, product identifiers, listing photos, and what to do when authenticity cannot be established.', date: 'February 12, 2026', category: 'Buyer Protection', readTime: '10 min read', @@ -97,64 +98,34 @@ export const blogArticles: BlogArticle[] = [ authorBio: 'The Saleh Store editorial team publishes practical buyer-protection guides focused on authenticity checks, listing evidence, seller information, and purchase terms.', gradient: 'from-red-500 to-orange-600', content: [ - { type: 'paragraph', text: 'Counterfeit products can create financial, safety, and warranty risks. Buyers can reduce uncertainty by checking the listing evidence, seller information, product identifiers, packaging, and applicable platform protections before purchasing.' }, - { type: 'heading', text: 'Red Flag #1: Price Too Good to Be True' }, - { type: 'paragraph', text: 'A price far below comparable authentic listings is a reason to investigate further, but price alone does not establish that a product is counterfeit. Compare multiple current and completed listings and examine the seller and item evidence.' }, - { type: 'list', items: [ - 'Research market value - check 10+ sold listings', - 'Fakes typically priced 50-70% below authentic', - 'Authentic sellers cannot afford to discount 80%', - 'Exception: Damaged/used items can be deeply discounted' - ]}, - { type: 'heading', text: 'Red Flag #2: Seller Location Mismatch' }, - { type: 'paragraph', text: 'Check the item location vs where it is shipping from:' }, - { type: 'list', items: [ - 'Shipping from China for US authentic Nike - obvious fake', - 'Long shipping times (20-40 days) indicate overseas fakes', - 'Authentic products ship domestically within 7 days max', - 'Use eBay Item location filter - select your country only' - ]}, - { type: 'heading', text: 'Red Flag #3: Suspicious Photos' }, - { type: 'paragraph', text: 'Professional counterfeiters steal authentic photos. Look for these tells:' }, - { type: 'list', items: [ - 'Stock photos or photos from brand websites - not their actual item', - 'Photos with different backgrounds/lighting - stolen from multiple sources', - 'Watermarks from other websites - copied listings', - 'No photos of serial numbers, tags, or authentication marks', - 'Blurry photos hiding quality issues' - ]}, - { type: 'quote', text: 'If you cannot see serial numbers, authentication tags, and detailed close-ups, assume it is fake until proven otherwise.' }, - { type: 'heading', text: 'Authentication Checklist: Nike Shoes' }, - { type: 'list', items: [ - 'Check SKU on box matches SKU on size tag inside shoe', - 'Stitching should be tight, even, and straight - fakes have messy stitching', - 'Smell test - authentic shoes do not have chemical/glue smell', - 'Swoosh should be smooth and precise - fake swooshes are often crooked', - 'UPC barcode scan should match exact product when searched' - ]}, - { type: 'heading', text: 'Authentication Checklist: Apple Products' }, + { type: 'paragraph', text: 'Counterfeit risk is not something a buyer can reliably reduce with one visual trick or a bargain-price rule. Authenticity depends on the product, seller, market, and the evidence available in the listing. A safer approach is to look for several independent signals and stop when the evidence is too weak.' }, + { type: 'heading', text: 'Start With the Seller and Listing' }, + { type: 'paragraph', text: 'Read the full description, inspect the seller information, and compare the item with other listings for the same model or variant. A polished title is not evidence of authenticity. Consistent photos, detailed specifications, and clear purchase terms are more useful.' }, + { type: 'heading', text: 'Treat Price as a Warning Signal, Not Proof' }, + { type: 'paragraph', text: 'A price far below comparable listings deserves investigation, but low price does not prove a counterfeit. Used, incomplete, discontinued, damaged, or locally collected items can have legitimate reasons for lower prices.' }, + { type: 'heading', text: 'Inspect Product Identifiers' }, + { type: 'paragraph', text: 'Check the model number, part number, serial or identification markings, packaging details, and included documentation when those features exist for the product. Compare them with the manufacturer information for the exact product rather than relying on memory or a generic image.' }, + { type: 'heading', text: 'Compare the Photos With the Description' }, + { type: 'paragraph', text: 'Look for actual-item photos that show the details relevant to authenticity. If photos are generic, heavily edited, inconsistent, or too limited to inspect important marks, the listing contains more uncertainty. Ask for clarification when appropriate.' }, + { type: 'heading', text: 'Use Official Verification Channels' }, + { type: 'paragraph', text: 'When the manufacturer provides an official serial-number, warranty, registration, or authentication process, use that process where applicable. A third-party comment or social-media post is not a substitute for an official verification source.' }, + { type: 'heading', text: 'Do Not Confuse a Good-Looking Replica With an Authentic Product' }, + { type: 'paragraph', text: 'High-quality photos and convincing packaging can still be copied. The relevant question is whether the available evidence establishes authenticity strongly enough for the purchase risk you are willing to accept.' }, + { type: 'heading', text: 'Before Checkout' }, { type: 'list', items: [ - 'Check serial number at Apple website - fakes show invalid', - 'Weight test - fakes are usually lighter (cheap materials)', - 'Lightning port should be perfectly centered and flush', - 'iOS devices: Check Settings > General > About - should show correct model', - 'AirPods: Connect to iPhone - real ones show battery animation' + 'Confirm the exact product, model, and variant.', + 'Compare several genuine-looking listings rather than one reference item.', + 'Inspect actual-item photos and identifying details.', + 'Check the manufacturer or authorized verification method when available.', + 'Review seller information and the return terms.', + 'Keep the listing details and messages for your records.' ]}, - { type: 'heading', text: 'What to Do If You Bought a Fake' }, - { type: 'paragraph', text: 'Do not panic. You are protected:' }, - { type: 'list', items: [ - 'Open eBay case within 30 days - select Item not as described', - 'Upload photos showing it is counterfeit', - 'Do not rely on a fixed success percentage; use the applicable eBay buyer-protection and counterfeit-reporting process', - 'Full refund including return shipping', - 'Report seller to eBay - they take counterfeits seriously' - ]}, - { type: 'paragraph', text: 'If you suspect a counterfeit item, document the listing, preserve your purchase records, and use the applicable eBay reporting and buyer-protection processes. Avoid reselling suspected counterfeit goods.' }, + { type: 'heading', text: 'If Authenticity Is Still Unclear' }, + { type: 'paragraph', text: 'Do not force a purchase decision when important evidence is missing. Choose another listing, ask the seller a specific question, or use the applicable marketplace protection and reporting process after purchase. Do not resell an item you reasonably suspect is counterfeit.' }, { type: 'heading', text: 'Disclosure' }, { type: 'paragraph', text: 'Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer.' } ] }, - { id: 4, indexable: false, From 6bc7842905b38bac29f925e78f7b603abbb17883 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:51:36 +0300 Subject: [PATCH 30/90] fix(adsense): expose only quality-gated editorial guides --- app/blog/page.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/blog/page.tsx b/app/blog/page.tsx index 07cca5a..b1d6d6e 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -20,7 +20,7 @@ export const metadata: Metadata = { }, }; -const displayPosts = blogArticles; +const displayPosts = blogArticles.filter((post) => post.indexable !== false); export default function BlogPage() { const blogSchema = { @@ -38,8 +38,8 @@ export default function BlogPage() { '@type': 'ItemList', '@id': absoluteUrl('/blog#articles'), name: 'Saleh Store shopping guides', - numberOfItems: blogArticles.length, - itemListElement: blogArticles.map((article, index) => ({ + numberOfItems: displayPosts.length, + itemListElement: displayPosts.map((article, index) => ({ '@type': 'ListItem', position: index + 1, url: absoluteUrl(`/blog/${article.slug}`), @@ -140,10 +140,10 @@ export default function BlogPage() { {/* Back to Shopping CTA */}

- 🎯 Ready to Start Shopping? + Continue From Research to Shopping

- Browse curated products across 12 categories and compare current eBay listings, seller details, and purchase terms. + Use the guides above to narrow the product and configuration you need, then compare current eBay listings, seller details, condition, and purchase terms.

Date: Tue, 6 Oct 2026 12:51:39 +0300 Subject: [PATCH 31/90] fix(adsense): keep related article links inside indexable corpus --- lib/related-blog-posts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/related-blog-posts.ts b/lib/related-blog-posts.ts index 671719e..135e579 100644 --- a/lib/related-blog-posts.ts +++ b/lib/related-blog-posts.ts @@ -35,7 +35,7 @@ export function getRelatedBlogPosts( const postExcerptTerms = terms(post.excerpt); return articles - .filter((candidate) => candidate.slug !== post.slug) + .filter((candidate) => candidate.slug !== post.slug && candidate.indexable !== false) .map((candidate, index) => { const candidateTitleTerms = terms(candidate.title); const candidateExcerptTerms = terms(candidate.excerpt); From ee272f1b9aa7fc4cd080ca20e4f46491d7241199 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:51:42 +0300 Subject: [PATCH 32/90] fix(adsense): remove category ad placement and clarify directory purpose --- app/categories/page.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/categories/page.tsx b/app/categories/page.tsx index 7e94a4a..00d29c5 100644 --- a/app/categories/page.tsx +++ b/app/categories/page.tsx @@ -2,7 +2,6 @@ import type { Metadata } from 'next'; import Link from 'next/link'; import { categories } from '../../lib/products'; import { absoluteUrl } from '../../lib/site'; -import AdSenseBlock from '../../components/AdSenseBlock'; export const metadata: Metadata = { title: 'All Categories | Saleh Store', @@ -24,18 +23,18 @@ export default function CategoriesPage() {

All Categories

- Browse popular Saleh Store departments and broad eBay marketplace categories. Each category is a searchable landing page for products in that department. + Browse the current Saleh Store category directory. Category pages are product-discovery surfaces; our independent buying guides provide the research used to evaluate configuration, compatibility, condition, cost, and purchase terms.

- -

Marketplace directory

-

{visibleCategories.length} category landing pages available.

+

+ {visibleCategories.length} searchable category destinations. Start with a guide when you need decision help, then use a category to inspect current listings. +

Back to home
From d5550e31e1e71081e93c091fe864df75d49ed237 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:51:45 +0300 Subject: [PATCH 33/90] fix(adsense): remove ads from research tools --- app/tools/deal-comparison/page.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/tools/deal-comparison/page.tsx b/app/tools/deal-comparison/page.tsx index 82caded..f8e4fc9 100644 --- a/app/tools/deal-comparison/page.tsx +++ b/app/tools/deal-comparison/page.tsx @@ -2,7 +2,6 @@ import { useMemo, useState } from 'react'; import Link from 'next/link'; -import AdSenseBlock from '../../../components/AdSenseBlock'; type Deal = { price: number; @@ -81,8 +80,6 @@ export default function DealComparisonPage() { Enter the same cost categories for both listings. Use zero when a cost does not apply. The calculator is deliberately simple: it makes hidden cost differences visible without claiming that price alone determines which listing is appropriate.

- -
From 7f2541581fe26060707871ca111f1460e23af406 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:51:49 +0300 Subject: [PATCH 34/90] fix(adsense): remove ads from research tools --- app/research/ebay-deal-comparison-methodology/page.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/research/ebay-deal-comparison-methodology/page.tsx b/app/research/ebay-deal-comparison-methodology/page.tsx index 7989e0d..e868e09 100644 --- a/app/research/ebay-deal-comparison-methodology/page.tsx +++ b/app/research/ebay-deal-comparison-methodology/page.tsx @@ -2,7 +2,6 @@ import type { Metadata } from 'next'; import Link from 'next/link'; import { absoluteUrl } from '../../../lib/site'; import { SchemaScript } from '../../../lib/schema'; -import AdSenseBlock from '../../../components/AdSenseBlock'; export const metadata: Metadata = { title: 'eBay Deal Comparison Methodology | Saleh Store', @@ -39,8 +38,6 @@ export default function MethodologyPage() { Saleh Store compares marketplace listings by normalizing the variables that can materially change the real cost or usefulness of a purchase.

- -

1. Normalize the product

From 7c5c17ba52292f347ba7aea5cbafd64a29162e88 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:51:51 +0300 Subject: [PATCH 35/90] fix(adsense): remove nonstandard ai-content metadata --- app/layout.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/layout.tsx b/app/layout.tsx index 2ef6e0e..dfce6f3 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -71,7 +71,6 @@ export default function RootLayout({ {/* Social Media Meta Tags */} - From 0d0d53f97569c262b9dbfe37023e3eb671fce7b2 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:52:26 +0300 Subject: [PATCH 36/90] fix(adsense): remove placeholder social links and add real contact path --- components/Footer.tsx | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/components/Footer.tsx b/components/Footer.tsx index 011696d..21c506a 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -12,19 +12,10 @@ export default function Footer() {

Your destination for discovering deals on electronics, gaming, sneakers, and more. We link you to eBay; purchases, seller relationships, shipping, returns, and buyer support are handled by eBay and the applicable seller.

- -
- +

+ For questions, corrections, or partnership enquiries, use our + Contact page. +

{/* Quick Links */}

Quick Links

From 1ce31109b9a88dd28e4ca95ffdc5537bf1059ddb Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:52:30 +0300 Subject: [PATCH 37/90] fix(adsense): replace unsupported about-page claims with editorial disclosure --- app/about/page.tsx | 289 ++++++++++++++------------------------------- 1 file changed, 86 insertions(+), 203 deletions(-) diff --git a/app/about/page.tsx b/app/about/page.tsx index 66015cb..e1cfbef 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -1,228 +1,111 @@ -import { Metadata } from 'next'; -import { absoluteUrl } from '../../lib/site'; +import type { Metadata } from 'next'; import Link from 'next/link'; +import { absoluteUrl } from '../../lib/site'; export const metadata: Metadata = { - title: 'About Us - Saleh Store', - description: 'Learn about Saleh Store, a product-discovery site focused on eBay listings, shopping research, and practical buying guides.', - alternates: { - canonical: absoluteUrl('/about'), - }, + title: 'About Saleh Store', + description: + 'Learn how Saleh Store combines eBay product discovery with practical, independent shopping research.', + alternates: { canonical: absoluteUrl('/about') }, }; export default function AboutPage() { return ( -
-
- {/* Hero Section */} -
-

- About Saleh Store -

-

- A product-discovery site for researching eBay listings +

+
+
+ +

About Saleh Store

+

+ Saleh Store is an eBay-only product-discovery site built around a simple principle: + useful shopping research should come before an affiliate click.

+
- {/* Our Story */} -
-

- Our Story -

-
-

- Saleh Store was born from a simple idea: make online shopping smarter, easier, and more rewarding. - We know how overwhelming it can be to find genuine deals among millions of products on eBay. +

+
+
+

What the site does

+

+ The site brings together marketplace product discovery and editorial buying guidance. + Product listings are a changing commercial layer; the editorial library focuses on the + decisions that are easier to get wrong, such as exact configuration, compatibility, + condition, delivered cost, accessories, and return terms.

-

- That's why we created Saleh Store - a curated platform that organizes product listings and practical buying information across electronics, - gaming, fashion, home goods, and more. We focus on making comparison and research easier. +

+ +
+

How we approach research

+

+ Guides are written to help a reader make a decision without depending on an affiliate + link. Where a claim depends on a live marketplace listing, current seller terms, price, + inventory, or availability, the marketplace listing is the final source of truth.

-

- We aim to help shoppers compare products, prices, seller information, and purchase terms before they buy. +

+ We avoid presenting generic listing copy as product testing and do not claim personal + ownership, hands-on testing, or credentials that are not documented.

-
-
- - {/* Mission */} -
-

- Our Mission -

-

- To empower shoppers with the tools, information, and confidence they need to make smart purchasing - decisions and get the best value for their money. -

-
- - {/* How It Works */} -
-

- How It Works -

-
-
-
- 1 -
-

- We Search -

-

- We monitor product listings and shopping topics to identify useful items and buying guides -

-
- -
-
- 2 -
-

- We Verify -

-

- Listings are presented with available product and seller information; buyers should verify current details on eBay -

-
+
-
-
- 3 +
+

Editorial standards

+
+
+

Specific over generic

+

Focus on decisions, tradeoffs, and details that materially change a purchase.

-

- You Save -

-

- Browse the collection and review the listing details before purchasing -

-
-
-
- - {/* Why Choose Us */} -
-

- Why Choose Saleh Store? -

-
-
-
- - - +
+

Evidence over claims

+

Separate known listing information from assumptions and avoid unsupported guarantees.

-
-

Curated Selection

-

Hand-picked deals across popular categories

-
-
- -
-
- - - +
+

Buyer value first

+

Affiliate links are secondary to the information needed to evaluate a purchase.

-
-

Regular Updates

-

Product listings and guides are updated as the site changes

+
+

Transparent limitations

+

When a conclusion cannot be established from available evidence, the guide says so.

+
-
-
- - - -
-
-

Trusted Sellers

-

Seller information is available so buyers can review the listing before purchase

-
+
+

Research resources

+
+ + Editorial Team + + + Comparison Methodology + + + Shopping Guides + + + Contact +
+
-
-
- - - -
-
-

100% Free

-

No fees, no subscriptions, just great deals

-
-
- -
-
- - - -
-
-

Easy to Use

-

Simple interface, product search, and direct eBay checkout

-
-
- -
-
- - - -
-
-

Secure Shopping

-

All purchases through eBay's secure platform

-
-
-
- - - {/* Stats */} -
-
-
-
Product listings
-
Catalog
-
-
-
6
-
Categories
-
-
-
Daily
-
Content updates
-
-
-
100%
-
Free Service
-
-
-
- - {/* CTA */} -
-

Ready to Start Saving?

-

- Compare current listings and read our buying guides before you purchase -

-
- - Browse Deals - - - Contact Us +
+

Affiliate relationship

+

+ Saleh Store participates in the eBay Partner Network. Some links may generate a + commission from qualifying purchases at no additional cost to the buyer. Product, + seller, price, inventory, shipping, and return information should be checked on eBay + before purchase. +

+ + Read the full affiliate and legal disclosure → -
-
- - + + + + ); } From da4e1e3d1787b8f7f63cbf0a808e95f6c1c62946 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:52:33 +0300 Subject: [PATCH 38/90] fix(adsense): rewrite FAQ with current factual site behavior --- app/faq/page.tsx | 197 +++++++++-------------------------------------- 1 file changed, 35 insertions(+), 162 deletions(-) diff --git a/app/faq/page.tsx b/app/faq/page.tsx index 432df28..62c6c94 100644 --- a/app/faq/page.tsx +++ b/app/faq/page.tsx @@ -1,175 +1,48 @@ -'use client'; - -import { useState } from 'react'; - - -interface FAQItem { - question: string; - answer: string; - category: string; -} - -const faqData: FAQItem[] = [ - { - category: 'General', - question: 'What is Saleh Store?', - answer: 'Saleh Store is a curated platform that helps you discover the best deals on eBay. We handpick trending products across electronics, gaming, fashion, home goods, and more, making it easy to find great value without endless searching.' - }, - { - category: 'General', - question: 'Is Saleh Store free to use?', - answer: 'Yes! Saleh Store is 100% free. We never charge fees or require subscriptions. We earn a small commission when you make a purchase through our affiliate links, but this never affects your price.' - }, - { - category: 'Shopping', - question: 'How do I purchase products?', - answer: 'When you click "View on eBay" on any product, you\'ll be redirected to eBay\'s website where you can complete your purchase securely through their platform. All transactions happen directly on eBay.' - }, - { - category: 'Shopping', - question: 'Are the prices on Saleh Store accurate?', - answer: 'We update prices regularly, but since they come from eBay, they can change quickly. Always verify the final price on eBay before purchasing. The price on eBay is the actual price you\'ll pay.' - }, - { - category: 'Shopping', - question: 'What payment methods are accepted?', - answer: 'Payment is handled directly by eBay. They accept major credit cards, PayPal, Apple Pay, Google Pay, and other payment methods depending on your location.' - }, - { - category: 'Deals', - question: 'How often are new deals added?', - answer: 'We update our deals daily! Our team searches eBay every day to bring you the latest and best offers. Check back regularly to not miss out on limited-time deals.' - }, - { - category: 'Deals', - question: 'How do you select deals?', - answer: 'We consider multiple factors: price discounts, seller reputation, product ratings, trending popularity, and value for money. Only deals that meet our quality standards are featured.' - }, - { - category: 'Deals', - question: 'Can I request specific products or deals?', - answer: 'While we don\'t take specific requests, we appreciate feedback! If there\'s a category or product type you\'d like to see more of, contact us and we\'ll consider it for future updates.' - }, - { - category: 'Account', - question: 'Do I need to create an account?', - answer: 'No account is needed to browse deals on Saleh Store. However, you\'ll need an eBay account to make purchases when you click through to eBay.' - }, - { - category: 'Account', - question: 'How can I save my favorite deals?', - answer: 'Currently, we recommend bookmarking products directly on eBay or saving links in your browser. We\'re working on adding a favorites feature in the future!' - }, - { - category: 'Support', - question: 'What if I have an issue with my order?', - answer: 'Since purchases are made through eBay, please contact eBay customer support for any order issues, returns, or refunds. They have excellent buyer protection policies.' - }, - { - category: 'Support', - question: 'How can I contact Saleh Store?', - answer: 'You can reach us through our Contact page. We typically respond within 24 hours during business days. For urgent eBay order issues, please contact eBay directly.' - }, - { - category: 'Support', - question: 'Can I report a broken link or incorrect information?', - answer: 'Absolutely! We appreciate you helping us maintain quality. Please use our Contact form to report any issues, and we\'ll fix them as soon as possible.' - } +import type { Metadata } from 'next'; +import { absoluteUrl } from '../../lib/site'; + +export const metadata: Metadata = { + title: 'FAQ | Saleh Store', + description: + 'Answers about Saleh Store, eBay product discovery, buying guides, prices, affiliate links, and support.', + alternates: { canonical: absoluteUrl('/faq') }, +}; + +const faqData = [ + ['What is Saleh Store?', 'Saleh Store is an eBay-only product-discovery site with shopping guides and comparison resources. The site helps readers research a purchase before following an outbound eBay link.'], + ['Does Saleh Store sell the products?', 'No. Saleh Store does not manufacture, stock, ship, or fulfill the products shown through its eBay links. Checkout and the transaction are handled on eBay and by the applicable seller.'], + ['Do prices stay the same?', 'No. Marketplace prices, inventory, shipping charges, taxes, seller terms, and availability can change. Treat the current eBay listing and checkout total as the source of truth before buying.'], + ['How does Saleh Store make money?', 'Saleh Store participates in the eBay Partner Network. Some outbound links may generate a commission from qualifying purchases at no additional cost to the buyer.'], + ['Are the buying guides sponsored by sellers?', 'The editorial guides are written independently of individual eBay sellers. A marketplace product link may be affiliate-linked, and the affiliate relationship is disclosed.'], + ['How are products compared?', 'The site emphasizes exact configuration, compatibility, condition, included accessories, delivered cost, seller information, and return terms. The relevant criteria depend on the product category.'], + ['Can Saleh Store guarantee that a listing is the cheapest?', 'No. A listing can change or disappear, and another seller may offer different terms. The guides explain how to compare listings rather than promise a universal lowest price.'], + ['What should I do about an eBay order problem?', 'Because the transaction happens on eBay, use the applicable eBay order, return, dispute, or buyer-support process. Saleh Store cannot issue an eBay refund or change a seller transaction.'], + ['How do I report incorrect information on Saleh Store?', 'Use the Contact page and describe the page, the specific statement, and the correction you believe is needed.'], + ['Where can I read the site policies?', 'Privacy, cookies, terms of use, and the affiliate/legal disclosure are linked in the site footer.'], ]; export default function FAQPage() { - const [openIndex, setOpenIndex] = useState(null); - const [activeCategory, setActiveCategory] = useState('All'); - - const categories = ['All', ...Array.from(new Set(faqData.map(item => item.category)))]; - - const filteredFAQs = activeCategory === 'All' - ? faqData - : faqData.filter(item => item.category === activeCategory); - return ( -
-
- {/* Header */} -
-

+
+
+
+

Frequently Asked Questions

-

- Find answers to common questions about Saleh Store +

+ Clear answers about Saleh Store, the eBay relationship, our research process, and what happens after an outbound marketplace click.

-

- - {/* Category Filter */} -
- {categories.map((category) => ( - - ))} -
+ - {/* FAQ Accordion */}
- {filteredFAQs.map((faq, index) => ( -
- - {openIndex === index && ( -
- {faq.answer} -
- )} -
+ {faqData.map(([question, answer]) => ( +
+

{question}

+

{answer}

+
))}
- - {/* Still have questions CTA */} -
-

Still have questions?

-

- We're here to help! Get in touch with our support team. -

- - Contact Us - -
-
-
+ + ); } From 6bf1574477039854ea7401b4fb4fe2f9fe1209b3 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:52:40 +0300 Subject: [PATCH 39/90] fix(adsense): noindex direct sponsorship sales page --- app/advertise/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/advertise/page.tsx b/app/advertise/page.tsx index aa85a70..b6a99f1 100644 --- a/app/advertise/page.tsx +++ b/app/advertise/page.tsx @@ -4,6 +4,7 @@ import { sponsorPackages } from '@/config/sponsor-packages'; import { SPONSORSHIP_CONTACT } from '@/config/sponsorship'; export const metadata: Metadata = { + robots: { index: false, follow: true }, title: 'Advertise on Saleh Store', description: 'Direct sponsorship opportunities on Saleh Store for brands, stores, and relevant services.', From b80a362275960ab4ddf86a904dcc746dc4da6ef6 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:52:47 +0300 Subject: [PATCH 40/90] fix(adsense): exclude commercial sponsorship page from sitemap --- app/sitemap.xml/route.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/sitemap.xml/route.ts b/app/sitemap.xml/route.ts index dd8b4df..1efa409 100644 --- a/app/sitemap.xml/route.ts +++ b/app/sitemap.xml/route.ts @@ -24,7 +24,6 @@ function buildEntries(): SitemapEntry[] { { loc: '/research/ebay-deal-comparison-methodology', changefreq: 'monthly', priority: '0.7' }, { loc: '/contact', changefreq: 'monthly', priority: '0.6' }, { loc: '/faq', changefreq: 'monthly', priority: '0.6' }, - { loc: '/advertise', changefreq: 'monthly', priority: '0.6' }, ]; // Product and category routes remain useful for visitors, but they are commerce/discovery From 356005d5aaf8767ce0bedef16fd2367cf3947669 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:53:49 +0300 Subject: [PATCH 41/90] fix(adsense): repair footer structure after social-link cleanup --- components/Footer.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/Footer.tsx b/components/Footer.tsx index 21c506a..e46cbb6 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -16,6 +16,8 @@ export default function Footer() { For questions, corrections, or partnership enquiries, use our Contact page.

+ + {/* Quick Links */}

Quick Links

From 16dcad4eb3ef73e3d915d06cee9fe53d1e1d6768 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:53:54 +0300 Subject: [PATCH 42/90] fix(adsense): keep blog category discovery limited to indexable guides --- app/blog/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/blog/page.tsx b/app/blog/page.tsx index b1d6d6e..6d773eb 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -122,8 +122,8 @@ export default function BlogPage() { Browse by Category
- {Array.from(new Set(blogArticles.map(article => article.category))).map((category) => { - const count = blogArticles.filter(article => article.category === category).length; + {Array.from(new Set(displayPosts.map(article => article.category))).map((category) => { + const count = displayPosts.filter(article => article.category === category).length; return (
📝
From e642d200fa4c9181af2fccffe2b16c40964c21ca Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:53:58 +0300 Subject: [PATCH 43/90] content: correct cornerstone guide reading-time estimates --- lib/expanded-blog-data.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/expanded-blog-data.ts b/lib/expanded-blog-data.ts index 0a6ed38..16b58cf 100644 --- a/lib/expanded-blog-data.ts +++ b/lib/expanded-blog-data.ts @@ -8,7 +8,7 @@ export const expandedBlogArticles: BlogArticle[] = [ excerpt: 'A practical laptop-buying guide for comparing new, open-box, and refurbished listings without getting distracted by flashy specifications.', date: 'September 26, 2026', category: 'Computers', - readTime: '16 min read', + readTime: '9 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-slate-600 to-blue-700', @@ -80,7 +80,7 @@ export const expandedBlogArticles: BlogArticle[] = [ excerpt: 'Model numbers, storage, carrier locks, battery health, condition, and regional variants can all change the value of a used phone.', date: 'September 26, 2026', category: 'Electronics', - readTime: '17 min read', + readTime: '8 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-indigo-600 to-violet-700', @@ -149,7 +149,7 @@ export const expandedBlogArticles: BlogArticle[] = [ excerpt: 'From dash cams and phone mounts to lighting and interior accessories, compatibility is often more important than the headline price.', date: 'September 26, 2026', category: 'Auto', - readTime: '17 min read', + readTime: '9 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-orange-600 to-red-700', @@ -221,7 +221,7 @@ export const expandedBlogArticles: BlogArticle[] = [ excerpt: 'A practical way to compare indoor and outdoor security cameras on eBay without focusing only on resolution.', date: 'September 26, 2026', category: 'Smart Home', - readTime: '15 min read', + readTime: '9 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-cyan-700 to-sky-700', @@ -257,7 +257,7 @@ export const expandedBlogArticles: BlogArticle[] = [ excerpt: 'Office chairs are difficult to compare from photos alone. Use dimensions, adjustment range, condition, shipping, and return terms to make a better comparison.', date: 'September 26, 2026', category: 'Office', - readTime: '14 min read', + readTime: '7 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-stone-600 to-neutral-800', @@ -373,7 +373,7 @@ export const expandedBlogArticles: BlogArticle[] = [ { id: 58, slug: 'lens-mount-compatibility-guide', title: 'Camera Lens Mount Compatibility Guide: Avoid the Expensive Mistake', excerpt: 'How to verify lens compatibility before buying used or new camera lenses.', date: 'September 26, 2026', category: 'Cameras & Photo', readTime: '16 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-fuchsia-700 to-purple-900', content: [{"type":"paragraph","text":"How to verify lens compatibility before buying used or new camera lenses. This guide focuses on the details that matter when comparing real marketplace listings, where configuration, condition, seller information, and total cost can change the decision."},{"type":"heading","text":"Mount Compatibility Comes First"},{"type":"paragraph","text":"A lens must match the camera mount or use an appropriate adapter. The same focal length exists across many mounts, so the number alone tells you little."},{"type":"heading","text":"Native vs Adapted Lenses"},{"type":"paragraph","text":"Adapters can affect autofocus, aperture control, stabilization, size, or electronic communication. Decide whether those trade-offs are acceptable."},{"type":"heading","text":"Sensor Coverage"},{"type":"paragraph","text":"A lens designed for one sensor format may behave differently on another. Field of view and image-circle coverage should be part of the compatibility check."},{"type":"heading","text":"Manual Focus Is a Trade-Off"},{"type":"paragraph","text":"Some adapted combinations work well manually but lose automatic functions. That can be fine for some photographers and frustrating for others."},{"type":"heading","text":"Used Listing Language"},{"type":"paragraph","text":"Read the exact mount name. Do not rely on a photo alone or assume a familiar camera brand means the lens fits every camera from that brand."},{"type":"heading","text":"A Safe Search Method"},{"type":"paragraph","text":"Search camera model plus exact lens mount, then confirm the manufacturer's mount designation. When a listing is ambiguous, investigate rather than guess."},{"type":"heading","text":"A Practical Comparison Checklist"},{"type":"list","items":["Confirm the exact model or product version.","Check configuration, compatibility, and condition.","Read what is included and what is missing.","Calculate the delivered cost.","Review seller information and return terms.","Compare at least two or three comparable listings before deciding."]},{"type":"paragraph","text":"The useful listing is usually the one that leaves the fewest important questions unanswered. A lower price is meaningful when the product still fits the job, the condition is understood, and the total cost remains sensible."},{"type":"paragraph","text":"Disclosure: Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer."}] }, { id: 59, slug: 'how-to-tell-ebay-deal-is-actually-good', title: 'How to Tell Whether an eBay Deal Is Actually Good', excerpt: 'A practical framework for judging price, condition, configuration, seller quality, and total cost.', date: 'September 26, 2026', category: 'Shopping Strategies', readTime: '18 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-blue-800 to-cyan-900', content: [{"type":"paragraph","text":"A practical framework for judging price, condition, configuration, seller quality, and total cost. This guide focuses on the details that matter when comparing real marketplace listings, where configuration, condition, seller information, and total cost can change the decision."},{"type":"heading","text":"Ignore the Discount Badge for a Minute"},{"type":"paragraph","text":"A large percentage reduction only tells you that two numbers differ. It does not tell you whether the lower number is a good current market price."},{"type":"heading","text":"Compare the Same Product"},{"type":"paragraph","text":"Exact model, capacity, generation, condition, bundle, and region should align before price comparisons mean much."},{"type":"heading","text":"Use Total Cost"},{"type":"paragraph","text":"Shipping, required accessories, and other unavoidable costs can change the comparison. The useful number is what you must spend to receive a usable product."},{"type":"heading","text":"Condition Has a Price"},{"type":"paragraph","text":"New, open-box, refurbished, and used products should not be treated as interchangeable. The discount should compensate for differences in condition and uncertainty."},{"type":"heading","text":"Seller and Returns Reduce Risk"},{"type":"paragraph","text":"Clear listing information and sensible return terms can be worth more than a tiny price difference. Seller history adds context but does not replace reading the listing."},{"type":"heading","text":"The Final Test"},{"type":"paragraph","text":"Ask whether you would still want the product without the discount headline. If not, the discount may be driving the purchase rather than the product solving a real need."},{"type":"heading","text":"A Practical Comparison Checklist"},{"type":"list","items":["Confirm the exact model or product version.","Check configuration, compatibility, and condition.","Read what is included and what is missing.","Calculate the delivered cost.","Review seller information and return terms.","Compare at least two or three comparable listings before deciding."]},{"type":"paragraph","text":"The useful listing is usually the one that leaves the fewest important questions unanswered. A lower price is meaningful when the product still fits the job, the condition is understood, and the total cost remains sensible."},{"type":"paragraph","text":"Disclosure: Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer."}] }, { id: 60, slug: 'best-ebay-buying-checklist-before-purchase', title: 'The eBay Buying Checklist: What to Check Before You Purchase', excerpt: 'A reusable final checklist for comparing products, listings, sellers, condition, shipping, and returns before buying.', date: 'September 26, 2026', category: 'Shopping Strategies', readTime: '16 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-teal-700 to-blue-900', content: [{type:'paragraph',text:'Most marketplace mistakes happen in the last few minutes before purchase. The product has already caught your attention, the price looks reasonable, and it becomes tempting to skip the details. A short final check can prevent that.'},{type:'heading',text:'Confirm the Exact Product'},{type:'paragraph',text:'Check the model number, generation, capacity, size, and regional version when relevant. Product titles are often shortened, while the specification section contains the detail that distinguishes one configuration from another.'},{type:'heading',text:'Check Compatibility'},{type:'paragraph',text:'For electronics, confirm connectors, software support, network compatibility, and required accessories. For car products, check vehicle year, model, trim, dimensions, and installation requirements. Compatibility should be settled before price.'},{type:'heading',text:'Read the Condition'},{type:'paragraph',text:'New, open-box, refurbished, and used listings represent different levels of uncertainty. Read the condition description and inspect actual-item photos when they matter. Do not turn vague language into an assumption.'},{type:'heading',text:'Check What You Receive'},{type:'paragraph',text:'Look at the included accessories, charger, cable, mounting hardware, manuals, controllers, batteries, or other components required for normal use. Missing pieces belong in the cost calculation.'},{type:'heading',text:'Look at the Seller and Returns'},{type:'paragraph',text:'Seller feedback provides context, while the individual listing tells you what is being sold. Read return conditions and understand what happens if the item does not match the description.'},{type:'heading',text:'Calculate the Delivered Cost'},{type:'paragraph',text:'Use the item price plus shipping and other unavoidable costs you can identify. A low headline price is not useful if the purchase requires several additional expenses.'},{type:'heading',text:'Compare Before You Commit'},{type:'paragraph',text:'Open two or three comparable listings. Sometimes a less obvious result has a better configuration, clearer condition, or lower total cost. Comparison is more reliable than impulse.'},{type:'heading',text:'The Final Five Questions'},{type:'list',items:['Is this exactly the product I need?','Will it work with what I already own?','Is the condition clear?','Do I understand the total cost and return terms?','Would I still buy it if the discount badge disappeared?']},{type:'paragraph',text:'A discount should support a buying decision, not create one. If the product solves a real need and the listing survives the checklist, the price can then be judged on its own terms.'},{type:'paragraph',text:'Disclosure: Saleh Store participates in the eBay Partner Network. Some outbound links may earn a commission at no additional cost to the buyer.'}] }, - { id: 61, slug: 'modern-anatomy-of-black-friday-how-deals-actually-work', title: 'Black Friday 2026: eBay Deals, Price History & Buying Guide', excerpt: 'Black Friday 2026 eBay deals explained: how to check price history, spot misleading discounts, compare laptops, TVs, gaming and electronics, and decide when to buy.', date: 'September 27, 2026', category: 'Shopping Strategies', readTime: '22 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-slate-900 to-blue-900', relatedCategorySlugs: ['electronics', 'gaming', 'home', 'clothing-shoes-accessories', 'computers-tablets-networking', 'tv-video-home-audio', 'video-games-consoles'], content: [ + { id: 61, slug: 'modern-anatomy-of-black-friday-how-deals-actually-work', title: 'Black Friday 2026: eBay Deals, Price History & Buying Guide', excerpt: 'Black Friday 2026 eBay deals explained: how to check price history, spot misleading discounts, compare laptops, TVs, gaming and electronics, and decide when to buy.', date: 'September 27, 2026', category: 'Shopping Strategies', readTime: '14 min read', author: 'Saleh Store Editorial Team', authorBio: 'The Saleh Store editorial team publishes practical product research and marketplace buying guides focused on specifications, price comparison, compatibility, condition, and purchase terms.', gradient: 'from-slate-900 to-blue-900', relatedCategorySlugs: ['electronics', 'gaming', 'home', 'clothing-shoes-accessories', 'computers-tablets-networking', 'tv-video-home-audio', 'video-games-consoles'], content: [ { type: 'paragraph', text: 'Black Friday 2026 falls on Friday, November 27, with Cyber Monday on Monday, November 30. On eBay, the event spans many shopping categories, so the useful question is not simply what is discounted but whether the exact listing is genuinely good value.' }, { type: 'paragraph', text: 'The useful question is not simply “What is discounted?” It is “Discounted from what, for which exact product, under which conditions, and compared with what price history?”' }, { type: 'heading', text: '1. When Is Black Friday 2026? Black Friday Week and Cyber Monday' }, From eff6fc4374771078fe975a94c45122485d2190cc Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:54:30 +0300 Subject: [PATCH 44/90] refactor(adsense): isolate favorites client view --- app/favorites/FavoritesClient.tsx | 90 +++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 app/favorites/FavoritesClient.tsx diff --git a/app/favorites/FavoritesClient.tsx b/app/favorites/FavoritesClient.tsx new file mode 100644 index 0000000..9b60530 --- /dev/null +++ b/app/favorites/FavoritesClient.tsx @@ -0,0 +1,90 @@ +'use client'; + +import Link from 'next/link'; +import { useFavorites } from '../../contexts/FavoritesContext'; +import { Product } from '../../lib/products'; +import ProductCard from '../../components/ProductCard'; +import Footer from '../../components/Footer'; +import { useToast } from '../../contexts/ToastContext'; + +export default function FavoritesClient() { + const { favorites, clearFavorites } = useFavorites(); + const { addToast } = useToast(); + + const handleClearAll = () => { + if (confirm('Are you sure you want to remove all favorites?')) { + clearFavorites(); + addToast('All favorites cleared', 'info'); + } + }; + + // Convert FavoriteItem to Product type with required fields + const favoriteProducts: Product[] = favorites.map(fav => ({ + id: fav.id, + title: fav.title, + price: fav.price, + originalPrice: fav.originalPrice, + currency: fav.currency || 'USD', + image: fav.image, + category: fav.category, + affiliateLink: fav.affiliateLink, + description: fav.description || `${fav.category} product from eBay`, + })); + + return ( +
+ + {/* Hero Section */} +
+
+

Your Favorites

+

+ {favorites.length} {favorites.length === 1 ? 'product' : 'products'} saved +

+
+
+ + {/* Favorites Grid */} +
+ {favorites.length === 0 ? ( +
+
💙
+

No favorites yet

+

+ Start browsing our products and click the heart icon to save your favorites! +

+ + Browse Products → + +
+ ) : ( + <> +
+

+ Saved Products +

+ +
+ +
+ {favoriteProducts.map((product) => ( + + ))} +
+ + )} +
+ + {/* Footer */} +
+
+ ); +} From 75d546d6d04f8263b87206f03a9568af9710c499 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:54:35 +0300 Subject: [PATCH 45/90] refactor(adsense): isolate compare client view --- app/compare/CompareClient.tsx | 209 ++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 app/compare/CompareClient.tsx diff --git a/app/compare/CompareClient.tsx b/app/compare/CompareClient.tsx new file mode 100644 index 0000000..7484d40 --- /dev/null +++ b/app/compare/CompareClient.tsx @@ -0,0 +1,209 @@ +'use client'; + +import { useSearchParams } from 'next/navigation'; +import Image from 'next/image'; +import Link from 'next/link'; +import { Suspense } from 'react'; +import { allProducts } from '../../lib/products'; +import Footer from '../../components/Footer'; +import { trackEvent } from '../../lib/analytics'; +import { formatPrice } from '../../lib/utils/price'; + +function CompareContent() { + const searchParams = useSearchParams(); + const idsParam = searchParams.get('ids'); + const ids = idsParam ? idsParam.split(',').map(Number) : []; + + const products = allProducts.filter(p => ids.includes(p.id)); + + if (products.length === 0) { + return ( +
+
+

No Products to Compare

+

Add products to compare from the product listings.

+ + Browse Products + +
+
+ ); + } + + const lowestPrice = Math.min(...products.map(p => p.price)); + const highestPrice = Math.max(...products.map(p => p.price)); + + return ( +
+ {/* Header */} +
+
+ +

+ Compare Products +

+

+ Comparing {products.length} products side by side +

+
+
+ + {/* Comparison Table */} +
+
+
+ + + + + {products.map(product => ( + + ))} + + + + {/* Price Row */} + + + {products.map(product => ( + + ))} + + + {/* Category Row */} + + + {products.map(product => ( + + ))} + + + {/* Description Row */} + + + {products.map(product => ( + + ))} + + + {/* Savings Row */} + + + {products.map(product => ( + + ))} + + + {/* Affiliate Link Row */} + + + {products.map(product => ( + + ))} + + +
Feature + +
+ {product.title} +
+

+ {product.title} +

+ +
Price + + {formatPrice(product.price, product.currency)} + + {product.price === lowestPrice && ( + Best Price! + )} + {product.originalPrice && ( + + {formatPrice(product.originalPrice, product.currency)} + + )} +
Category + + {product.category} + +
Description + {product.description || 'No description available'} +
Savings + {product.originalPrice ? ( +
+ + {formatPrice(product.originalPrice - product.price, product.currency)} off + + + ({Math.round((1 - product.price / product.originalPrice) * 100)}% discount) + +
+ ) : ( + No discount + )} +
Action + trackEvent({ event: 'affiliate_outbound_click', productId: product.id, source: 'compare_page', category: product.category, placement: 'compare_cta', url: product.affiliateLink })} + className="inline-block bg-blue-600 text-white px-6 py-2 rounded-lg hover:bg-blue-700 transition-colors font-medium" + > + Shop on eBay + +
+
+
+
+ + {/* Summary */} +
+
+

+ 💡 Our Recommendation +

+

+ Based on price alone, the {products.find(p => p.price === lowestPrice)?.title} offers + the best value at {formatPrice(lowestPrice)}. + {highestPrice - lowestPrice > 0 && ( + <> That's a savings of {formatPrice(highestPrice - lowestPrice)} compared to the most expensive option. + )} +

+
+
+ +
+
+ ); +} + +export default function CompareClient() { + return ( + +
+
+

Loading comparison...

+
+ + }> + +
+ ); +} From 6382fc65366f4ef84b32e77ecd6f0b5005735bf8 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:54:38 +0300 Subject: [PATCH 46/90] fix(adsense): noindex personalized favorites utility --- app/favorites/page.tsx | 94 ++++-------------------------------------- 1 file changed, 8 insertions(+), 86 deletions(-) diff --git a/app/favorites/page.tsx b/app/favorites/page.tsx index 1e976f0..bc24b80 100644 --- a/app/favorites/page.tsx +++ b/app/favorites/page.tsx @@ -1,90 +1,12 @@ -'use client'; +import type { Metadata } from 'next'; +import FavoritesClient from './FavoritesClient'; -import Link from 'next/link'; -import { useFavorites } from '../../contexts/FavoritesContext'; -import { Product } from '../../lib/products'; -import ProductCard from '../../components/ProductCard'; -import Footer from '../../components/Footer'; -import { useToast } from '../../contexts/ToastContext'; +export const metadata: Metadata = { + title: 'Saved Favorites | Saleh Store', + description: 'Saved product selections on Saleh Store. This personalized utility page is not intended for search indexing.', + robots: { index: false, follow: true }, +}; export default function FavoritesPage() { - const { favorites, clearFavorites } = useFavorites(); - const { addToast } = useToast(); - - const handleClearAll = () => { - if (confirm('Are you sure you want to remove all favorites?')) { - clearFavorites(); - addToast('All favorites cleared', 'info'); - } - }; - - // Convert FavoriteItem to Product type with required fields - const favoriteProducts: Product[] = favorites.map(fav => ({ - id: fav.id, - title: fav.title, - price: fav.price, - originalPrice: fav.originalPrice, - currency: fav.currency || 'USD', - image: fav.image, - category: fav.category, - affiliateLink: fav.affiliateLink, - description: fav.description || `${fav.category} product from eBay`, - })); - - return ( -
- - {/* Hero Section */} -
-
-

Your Favorites

-

- {favorites.length} {favorites.length === 1 ? 'product' : 'products'} saved -

-
-
- - {/* Favorites Grid */} -
- {favorites.length === 0 ? ( -
-
💙
-

No favorites yet

-

- Start browsing our products and click the heart icon to save your favorites! -

- - Browse Products → - -
- ) : ( - <> -
-

- Saved Products -

- -
- -
- {favoriteProducts.map((product) => ( - - ))} -
- - )} -
- - {/* Footer */} -
-
- ); + return ; } From 8b09b0b673347f20b36d6283b088723940291aca Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:54:42 +0300 Subject: [PATCH 47/90] fix(adsense): noindex personalized compare utility --- app/compare/page.tsx | 213 ++----------------------------------------- 1 file changed, 8 insertions(+), 205 deletions(-) diff --git a/app/compare/page.tsx b/app/compare/page.tsx index 2bde8db..f80c451 100644 --- a/app/compare/page.tsx +++ b/app/compare/page.tsx @@ -1,209 +1,12 @@ -'use client'; +import type { Metadata } from 'next'; +import CompareClient from './CompareClient'; -import { useSearchParams } from 'next/navigation'; -import Image from 'next/image'; -import Link from 'next/link'; -import { Suspense } from 'react'; -import { allProducts } from '../../lib/products'; -import Footer from '../../components/Footer'; -import { trackEvent } from '../../lib/analytics'; -import { formatPrice } from '../../lib/utils/price'; - -function CompareContent() { - const searchParams = useSearchParams(); - const idsParam = searchParams.get('ids'); - const ids = idsParam ? idsParam.split(',').map(Number) : []; - - const products = allProducts.filter(p => ids.includes(p.id)); - - if (products.length === 0) { - return ( -
-
-

No Products to Compare

-

Add products to compare from the product listings.

- - Browse Products - -
-
- ); - } - - const lowestPrice = Math.min(...products.map(p => p.price)); - const highestPrice = Math.max(...products.map(p => p.price)); - - return ( -
- {/* Header */} -
-
- -

- Compare Products -

-

- Comparing {products.length} products side by side -

-
-
- - {/* Comparison Table */} -
-
-
- - - - - {products.map(product => ( - - ))} - - - - {/* Price Row */} - - - {products.map(product => ( - - ))} - - - {/* Category Row */} - - - {products.map(product => ( - - ))} - - - {/* Description Row */} - - - {products.map(product => ( - - ))} - - - {/* Savings Row */} - - - {products.map(product => ( - - ))} - - - {/* Affiliate Link Row */} - - - {products.map(product => ( - - ))} - - -
Feature - -
- {product.title} -
-

- {product.title} -

- -
Price - - {formatPrice(product.price, product.currency)} - - {product.price === lowestPrice && ( - Best Price! - )} - {product.originalPrice && ( - - {formatPrice(product.originalPrice, product.currency)} - - )} -
Category - - {product.category} - -
Description - {product.description || 'No description available'} -
Savings - {product.originalPrice ? ( -
- - {formatPrice(product.originalPrice - product.price, product.currency)} off - - - ({Math.round((1 - product.price / product.originalPrice) * 100)}% discount) - -
- ) : ( - No discount - )} -
Action - trackEvent({ event: 'affiliate_outbound_click', productId: product.id, source: 'compare_page', category: product.category, placement: 'compare_cta', url: product.affiliateLink })} - className="inline-block bg-blue-600 text-white px-6 py-2 rounded-lg hover:bg-blue-700 transition-colors font-medium" - > - Shop on eBay - -
-
-
-
- - {/* Summary */} -
-
-

- 💡 Our Recommendation -

-

- Based on price alone, the {products.find(p => p.price === lowestPrice)?.title} offers - the best value at {formatPrice(lowestPrice)}. - {highestPrice - lowestPrice > 0 && ( - <> That's a savings of {formatPrice(highestPrice - lowestPrice)} compared to the most expensive option. - )} -

-
-
- -
-
- ); -} +export const metadata: Metadata = { + title: 'Compare Products | Saleh Store', + description: 'Side-by-side product comparison on Saleh Store. This personalized utility page is not intended for search indexing.', + robots: { index: false, follow: true }, +}; export default function ComparePage() { - return ( - -
-
-

Loading comparison...

-
- - }> - -
- ); + return ; } From b3b66b29f18eeeca45c1a94d0d44d46da10151c6 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:55:07 +0300 Subject: [PATCH 48/90] test(adsense): enforce editorial corpus and commercial restraint --- __tests__/adsense/editorial-gate.test.ts | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 __tests__/adsense/editorial-gate.test.ts diff --git a/__tests__/adsense/editorial-gate.test.ts b/__tests__/adsense/editorial-gate.test.ts new file mode 100644 index 0000000..fa22ea7 --- /dev/null +++ b/__tests__/adsense/editorial-gate.test.ts @@ -0,0 +1,40 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { blogArticles } from '../../lib/blog-data'; + +describe('AdSense editorial gate', () => { + it('keeps the public editorial corpus intentionally small and explicit', () => { + expect(blogArticles.filter((article) => article.indexable !== false).map((article) => article.id)) + .toEqual([31, 33, 35, 37, 38, 61]); + }); + + it('does not expose duplicate article slugs', () => { + const slugs = blogArticles.map((article) => article.slug); + expect(new Set(slugs).size).toBe(slugs.length); + }); + + it('keeps selected guides free of fabricated first-person testing claims', () => { + const selected = blogArticles.filter((article) => article.indexable !== false); + const articleText = selected + .flatMap((article) => article.content) + .map((block) => [block.text ?? '', ...(block.items ?? [])].join(' ')) + .join(' '); + + expect(articleText).not.toMatch(/\b(I\s+(?:tested|personally|owned|used)|my\s+(?:testing|experience)|we\s+(?:tested|personally))\b/i); + }); + + it('keeps commercial ad/sponsorship components out of editorial and research pages', () => { + const routes = [ + 'app/blog/[slug]/page.tsx', + 'app/blog/page.tsx', + 'app/categories/page.tsx', + 'app/tools/deal-comparison/page.tsx', + 'app/research/ebay-deal-comparison-methodology/page.tsx', + ]; + + for (const route of routes) { + const source = fs.readFileSync(path.join(process.cwd(), route), 'utf8'); + expect(source).not.toMatch(/AdSenseBlock|SponsorSlot/); + } + }); +}); From 18a04c928eef1a17480db1dbfff053c65d46c207 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:55:50 +0300 Subject: [PATCH 49/90] fix(adsense): remove homepage commercial slots and feature editorial guides --- app/page.tsx | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 882cce3..daee298 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -8,10 +8,9 @@ import Footer from '@/components/Footer'; import DealOfTheDay from '@/components/DealOfTheDay'; import { useToast } from '@/contexts/ToastContext'; import { allProducts, categories, createSearchLink, featuredProducts, Product } from '@/lib/products'; +import { blogArticles } from '@/lib/blog-data'; import { formatPrice } from '@/lib/utils/price'; import { trackEvent } from '@/lib/analytics'; -import AdSenseBlock from '@/components/AdSenseBlock'; -import SponsorSlot from '@/components/SponsorSlot'; import { useRecentlyViewed } from '@/contexts/RecentlyViewedContext'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; @@ -242,8 +241,6 @@ export default function Home() {
- -
@@ -268,6 +265,30 @@ export default function Home() {
+
+
+
+
+ Editorial library + +

+ These guides explain the details that are easy to miss in marketplace listings. Read the relevant guide first, then use the catalog to compare current offers. +

+
+ See all guides → +
+
+ {blogArticles.filter((article) => article.indexable !== false).map((article) => ( + + {article.category} +

{article.title}

+

{article.excerpt}

+ + ))} +
+
+
+
@@ -407,8 +428,6 @@ export default function Home() {

{catalog.length}

Products loaded

{categories.length - 1}

Categories

Browse Deals

Current catalog

- -
); From 981850dedf7124a8f6be30a4e35ce11dea9dde8d Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:56:01 +0300 Subject: [PATCH 50/90] test(adsense): include homepage in commercial restraint gate --- __tests__/adsense/editorial-gate.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/__tests__/adsense/editorial-gate.test.ts b/__tests__/adsense/editorial-gate.test.ts index fa22ea7..e110daf 100644 --- a/__tests__/adsense/editorial-gate.test.ts +++ b/__tests__/adsense/editorial-gate.test.ts @@ -25,6 +25,7 @@ describe('AdSense editorial gate', () => { it('keeps commercial ad/sponsorship components out of editorial and research pages', () => { const routes = [ + 'app/page.tsx', 'app/blog/[slug]/page.tsx', 'app/blog/page.tsx', 'app/categories/page.tsx', From b28dc104a411f4edaa7b34e6de6c51ac60ffffe9 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:57:08 +0300 Subject: [PATCH 51/90] fix(adsense): reduce homepage commercial density and remove affiliate-first CTA --- app/page.tsx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index daee298..58ec9a9 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -5,7 +5,6 @@ import Image from 'next/image'; import ProductCard from '@/components/ProductCard'; import { ProductSkeletonGrid } from '@/components/ProductSkeleton'; import Footer from '@/components/Footer'; -import DealOfTheDay from '@/components/DealOfTheDay'; import { useToast } from '@/contexts/ToastContext'; import { allProducts, categories, createSearchLink, featuredProducts, Product } from '@/lib/products'; import { blogArticles } from '@/lib/blog-data'; @@ -37,8 +36,6 @@ export default function Home() { const [catalogSource, setCatalogSource] = useState<'static' | 'ebay_live' | 'error'>('static'); const [mostWanted, setMostWanted] = useState(featuredProducts.slice(0, 8)); const [mostWantedSource, setMostWantedSource] = useState<'static' | 'ebay_live'>('static'); - const [highValueTrending, setHighValueTrending] = useState([]); - const [highValueTrendingLoading, setHighValueTrendingLoading] = useState(true); const [blackFridayTime, setBlackFridayTime] = useState({ days: 0, hours: 0, @@ -412,8 +409,6 @@ export default function Home() {
- -

{showAllProducts ? 'All Products' : 'Featured Products'}({filteredProducts.length} products)

$ setPriceRange([Number(e.target.value), priceRange[1]])} className="w-16 text-sm bg-transparent text-gray-700 dark:text-gray-200 focus:outline-none" placeholder="Min" />- setPriceRange([priceRange[0], Number(e.target.value)])} className="w-16 text-sm bg-transparent text-gray-700 dark:text-gray-200 focus:outline-none" placeholder="Max" />
@@ -424,7 +419,23 @@ export default function Home() { {recentlyViewed.length > 0 && !isLoading && (

Recently Viewed

)} -
+
+ +

{catalog.length}

Products loaded

{categories.length - 1}

Categories

Browse Deals

Current catalog

From 09339b00a52f0bbd4d20d6d89f9a1e544864ca26 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:57:18 +0300 Subject: [PATCH 52/90] fix(adsense): remove redundant high-value marketplace feed --- app/page.tsx | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 58ec9a9..e8490dc 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -169,40 +169,6 @@ export default function Home() { return () => { isMounted = false; }; }, []); - // Load a dedicated higher-value discovery feed. It stays separate from the - // primary catalog and Most Wanted feed so a failed request cannot affect them. - useEffect(() => { - let isMounted = true; - - async function loadHighValueTrending(): Promise { - try { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 10000); - const response = await fetch('/api/ebay/high-value-trending?limit=8', { - signal: controller.signal, - cache: 'no-store', - }); - clearTimeout(timeoutId); - - const data = await response.json() as { products?: Product[] }; - if (!isMounted) return; - - if (response.ok && data.products?.length) { - setHighValueTrending(data.products.slice(0, 8)); - } - } catch { - // Keep the section hidden when live discovery is unavailable. - } finally { - if (isMounted) { - setHighValueTrendingLoading(false); - } - } - } - - void loadHighValueTrending(); - return () => { isMounted = false; }; - }, []); - // Filter and sort products let filteredProducts = catalog.filter(p => p.price >= priceRange[0] && p.price <= priceRange[1] From cf22e8c744d6faac195308e14ba3673e9f4ff596 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:57:42 +0300 Subject: [PATCH 53/90] fix(adsense): remove commercial product links from editorial article pages --- app/blog/[slug]/page.tsx | 79 +--------------------------------------- 1 file changed, 2 insertions(+), 77 deletions(-) diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index 562a163..3e0ee96 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -2,7 +2,6 @@ import { Metadata } from 'next'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { blogArticles, BlogArticle } from '../../../lib/blog-data'; -import { allProducts, categories } from '../../../lib/products'; import SocialShare from '../../../components/SocialShare'; import Footer from '../../../components/Footer'; import { absoluteUrl } from '../../../lib/site'; @@ -81,32 +80,6 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) { }); const allRelatedPosts = getRelatedBlogPosts(post, blogArticles, 3); - const blogCategoryMap: Record = { - Electronics: 'electronics', - Gaming: 'gaming', - 'Smart Home': 'smart-home', - Auto: 'auto', - Office: 'office', - Home: 'home', - Collectibles: 'collectibles', - 'Cameras & Photo': 'cameras-photo', - Computers: 'computers-tablets-networking', - }; - const categorySlug = blogCategoryMap[post.category]; - const linkedCategory = categorySlug - ? categories.find((category) => category.slug === categorySlug) - : undefined; - const resourceCategories = (post.relatedCategorySlugs ?? (categorySlug ? [categorySlug] : [])) - .map((slug) => categories.find((category) => category.slug === slug)) - .filter((category): category is (typeof categories)[number] => Boolean(category)); - const linkedProducts = resourceCategories.length > 0 - ? allProducts - .filter((product) => resourceCategories.some((category) => product.category.toLowerCase() === category.name.toLowerCase())) - .slice(0, 6) - : linkedCategory - ? allProducts.filter((product) => product.category.toLowerCase() === linkedCategory.name.toLowerCase()).slice(0, 4) - : []; - const breadcrumbSchema = generateBreadcrumbSchema([ { name: 'Home', url: absoluteUrl('/') }, { name: 'Blog', url: absoluteUrl('/blog') }, @@ -249,7 +222,7 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) { {/* Social Share - Bottom */}

- Found this helpful? Share it with your network! + Share this guide

- {/* Related Shopping Resources */} - {(linkedCategory || linkedProducts.length > 0) && ( -
-
- -

- Continue researching the category and compare related products before buying. -

- {resourceCategories.length > 0 ? ( -
- {resourceCategories.map((category) => ( - - Browse {category.name} → - - ))} -
- ) : linkedCategory ? ( - - Browse {linkedCategory.name} → - - ) : null} - {linkedProducts.length > 0 && ( -
    - {linkedProducts.map((product) => ( -
  • - - {product.title} - -
  • - ))} -
- )} -
-
- )} - - {/* Related Posts */} + {/* Related Posts */ {allRelatedPosts.length > 0 && (

From 395f3e81a66c610d95c46f06370f9d636de80cab Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:58:39 +0300 Subject: [PATCH 54/90] fix(adsense): remove unsupported contact claims and placeholder social links --- app/contact/page.tsx | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/app/contact/page.tsx b/app/contact/page.tsx index 63fa725..b127df4 100644 --- a/app/contact/page.tsx +++ b/app/contact/page.tsx @@ -160,15 +160,11 @@ export default function ContactPage() {

- {/* Social Media */} + {/* Contact scope */}
-

- Follow Us -

-

- Stay updated with our latest deals and offers -

-
+

What we can help with

+

+ Send a specific correction, broken-link report, editorial question, or partnership enquiry. For an eBay order, refund, return, or seller dispute, use eBay's own support channels. @@ -184,11 +180,4 @@ export default function ContactPage() { -

-
-
-
- - - ); -} + From 460d2df92b4d987e7b2ab47903d41812720759a9 Mon Sep 17 00:00:00 2001 From: Ossama Hashim Date: Tue, 6 Oct 2026 12:58:58 +0300 Subject: [PATCH 55/90] fix(adsense): replace contact placeholders with functional factual page --- app/contact/page.tsx | 210 +++++++++++-------------------------------- 1 file changed, 52 insertions(+), 158 deletions(-) diff --git a/app/contact/page.tsx b/app/contact/page.tsx index b127df4..fee6c11 100644 --- a/app/contact/page.tsx +++ b/app/contact/page.tsx @@ -1,183 +1,77 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; +import Link from 'next/link'; import { absoluteUrl } from '../../lib/site'; export const metadata: Metadata = { title: 'Contact Us - Saleh Store', - description: 'Get in touch with Saleh Store. We\'re here to help with any questions about deals, products, or our service.', - alternates: { - canonical: absoluteUrl('/contact'), - }, + description: 'Contact Saleh Store for corrections, editorial questions, partnership enquiries, or general site feedback.', + alternates: { canonical: absoluteUrl('/contact') }, }; export default function ContactPage() { return ( -
-
- {/* Header */} -
-

- Contact Us -

-

- Have a question or feedback? We'd love to hear from you! +

+
+
+

Contact Saleh Store

+

+ Use this page to report incorrect information, broken links, editorial questions, partnership enquiries, or other site issues.

-
+ + +
+
+

Send a message

+

+ Give enough detail for the team to identify the relevant page or statement and explain the correction or question. +

-
- {/* Contact Form */} -
-

- Send us a Message -

- -
- {/* Name */} +
- - + +
- - {/* Email */}
- - + +
- - {/* Subject */}
- - + +
- - {/* Message */}
- -