What we changed in the parser, classification, design, and infrastructure, and when. Newest entries at the top.
🔌 Partnerkin: one more job source
We connected scraping for partnerkin.com — that gives roughly 10–50 new jobs per day across nine categories (affiliate, management, account farming, SEO, sales, design and others). They will be collected automatically every six hours and added to our common catalog.
🌙 Monitoring is quieter at night
Before, the system could send a false «parser is down» alert at four in the morning, simply because nobody was publishing in the channels. Now alerts are not sent during Moscow night hours (from 23:00 to 08:00), and the sensitivity threshold is higher — it only wakes us up on a real breakage.
🔬 Microsoft Clarity: heatmaps and session recordings
We connected Microsoft Clarity for behavior analysis. We can now see how users click, scroll and where they «get stuck» on pages. That helps us improve navigation and copy based on live data instead of guesses.
💰 Salaries: quality upgrade
We ran every job through AI-driven salary normalization. Garbage values used to leak in — like «10 USD/month» — because the text said «payout on the 10th». Such cases are now recognized as «salary not specified», while real ranges (like $1500–3000) are written cleanly. The Google for Jobs salary filter sees us again.
🧹 Duplicate jobs: collapsed 89 groups
Previously the same job could appear 2–9 times — reposted across different channels with different HR contacts. We fixed the merging logic: we now compare by the content itself rather than by contacts. 89 duplicate groups were removed from the database (174 rows merged into 85 master records).
⚡ Bing and IndexNow: faster indexing
We connected Bing Webmaster Tools and the IndexNow API. Every new job is now automatically pinged to Bing, Yandex, Naver and Seznam — indexing dropped from days to hours.
📈 Major SEO campaign: 9 areas at once
Expanded the glossary from 31 to 63 industry terms.
The /about and /methodology pages were rewritten in plain language, with real examples.
Comparison pages now show full tables with figures from our database.
Every role and vertical got a 200–400 word description and a FAQ block.
Every job now has a markdown version at /job/{slug}.md — built for AI assistants.
🛠 JSON-LD: critical fix
Found and fixed a structured-data bug across the entire site — Google had not seen our jobs in Google for Jobs for a month because of a template-level conflict. After the fix all 600+ jobs are back with correct markup.
🆕 New job sources
Launched scrapers for cpa.live (still in development — needs a proxy) and partnerkin.com (test run succeeded, went live on May 12).
🔒 Domain isolation and UX upgrades
Fixed /reports and /companies — previously a middleware was 301-redirecting them to the parent domain, which leaked the relationship between sites and killed SEO. Added a carve-out for the catalog — we now have our own Report/CompanyController.
Expired jobs now open with a red «Job closed» banner, meta robots noindex,follow and a link to similar active jobs. Previously they returned 404 — backlinks and sitemap signals were being lost.
Added Vary: Accept-Encoding, Host to Cache-Control, so the CDN does not serve the parent domain's HTML on a catalog request and vice versa.
Mega-menu: removed the 6px gap between the trigger and the panel — the cursor used to «lose» the menu while moving down. An invisible padding-top bridge now catches the hover.
Homepage: top jobs moved from cards to a table (Vacancy / Company / Salary / Format / Tags / Date) — more compact, more jobs visible on one screen.
Homepage: «Verticals / Roles / Employers» — was 3 blocks in a row, now one section with tabs. Saves about two-thirds of the page height.
💼 logo in the header with an amber drop shadow.
OG image 1200×630 (PNG 107 KB) for social networks.
🚀 Performance — 100 / 100 mobile
Lighthouse mobile Performance: was 83–97, now 99–100 / 100 on every key page.
LCP (Largest Contentful Paint — main-content render speed): was 4.3 seconds on /jobs and /market-pulse, now 1.5–1.7 seconds.
Lazy-loaded analytics trackers: 236 KB of Google Analytics and Yandex.Metrika JS no longer blocks the first load — it loads on the first user interaction (or after 6.5 seconds as a fallback for search bots).
SEO 100 / 100 on every page. CLS (layout shift) = 0. TBT (main-thread blocking) = 0 ms.
📚 Glossary and jargon dictionary
New page /jobs/glossary — 31 industry-jargon terms: CPA, CPL, RevShare, FTD, ROI, account farmer, media buyer, accounts, ZRD, BM, traffic combo, caps, GEO, vertical and more.
DefinedTermSet schema for Google Rich Results — the glossary is now visible in enhanced search results.
Account farmer role — a separate jobs cluster (65 positions). Backfilled via regex (farm / warm-up / ZRD / multi-account / account farming / warming up).
AI overview via Claude Sonnet: 96% of active jobs received tags for vertical, role and seniority (junior / middle / senior).
🚀 Relaunch on new infrastructure
Migrated the backend to Laravel 11 (from custom PHP). A single technology stack across the whole ecosystem.
3,355 jobs were ported over without losing history or links to sources.
New visual identity — amber accent (#f59e0b), the shared ecosystem design system.
The Telegram parser moved to our pool of 15 accounts (Telethon library, Python).
AI moderation switched from OpenAI gpt-4o-mini to Claude Sonnet — better classification quality at controlled cost.
📊 AI moderation and analytics
Auto-publishing of confident cases and auto-rejection of fraudulent jobs via the LLM.
Daily-rollup analytics: jobs with salary, format, vertical, top roles.
Quality score per job (description completeness, presence of a company, contacts, location).
🔍 Structured data and SEO
JSON-LD JobPosting for every job — the catalog is ready for Google Jobs.
Yandex Vacancy Feed (XML) for Yandex.Rabota.
Sitemap with 887 active jobs and 500 company cards.