<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yooexo</title>
    <description>The latest articles on DEV Community by yooexo (@yooexo).</description>
    <link>https://dev.to/yooexo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4082093%2Ffbf9fbef-19ee-4cb6-808a-30de8bc0e82d.jpg</url>
      <title>DEV Community: yooexo</title>
      <link>https://dev.to/yooexo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yooexo"/>
    <language>en</language>
    <item>
      <title>Building a Proxy Health-Check Dashboard for 1000+ Residential IPs</title>
      <dc:creator>yooexo</dc:creator>
      <pubDate>Wed, 30 Sep 2026 03:24:00 +0000</pubDate>
      <link>https://dev.to/yooexo/building-a-proxy-health-check-dashboard-for-1000-residential-ips-3n93</link>
      <guid>https://dev.to/yooexo/building-a-proxy-health-check-dashboard-for-1000-residential-ips-3n93</guid>
      <description>&lt;p&gt;A rotating residential pool with 1,000 IPs sounds like abundance until you measure it. On any given hour, 4-7% of the pool is broken: unreachable, geo-drifted, ISP mislabeled, or already on someone else's abuse list. Nobody tells you which ones. Your account gets flagged, you check the proxy provider dashboard, and it shows "all systems operational."&lt;/p&gt;

&lt;p&gt;The only fix is your own monitoring stack. This article covers the one that has held up across three production pools: what to check, how often, where to store the data, which Grafana panels actually catch incidents before users do, and how the health signal loops back into the &lt;a href="https://www.bitbrowser.net/" rel="noopener noreferrer"&gt;BitBrowser&lt;/a&gt; profile fleet so bad IPs stop getting reassigned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "proxy health" actually means
&lt;/h2&gt;

&lt;p&gt;Proxy health is not a single metric. It is a rolling composite of five signals, each of which fails independently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connectivity.&lt;/strong&gt; Does the proxy answer a TCP handshake in under 3 seconds?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress IP correctness.&lt;/strong&gt; When you route a request through it, does the destination see the IP the provider promised?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geolocation accuracy.&lt;/strong&gt; Does the IP resolve to the country and region the provider claims?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISP classification.&lt;/strong&gt; Does the IP register as &lt;code&gt;residential&lt;/code&gt; (or &lt;code&gt;mobile&lt;/code&gt;) rather than &lt;code&gt;hosting&lt;/code&gt; or &lt;code&gt;datacenter&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reputation status.&lt;/strong&gt; Is the IP on Spamhaus DROP, on Scamalytics' fraud list, or blocked by Cloudflare's threat score?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A proxy can pass 1-3 and fail 4-5, and the failure is invisible until an account signup gets a CAPTCHA loop or a payment gateway declines the transaction. All five need continuous checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The metrics catalog
&lt;/h2&gt;

&lt;p&gt;The dashboard tracks eleven metrics per IP. Nine come from active probes, two from the fleet feedback loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;proxy_up&lt;/code&gt; (0 or 1)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_latency_ms&lt;/code&gt; (histogram)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_egress_ip_match&lt;/code&gt; (0 or 1)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_geo_country&lt;/code&gt;, &lt;code&gt;proxy_geo_region&lt;/code&gt; (labels)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_isp_type&lt;/code&gt; (residential, mobile, hosting, unknown)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_reputation_score&lt;/code&gt; (0-100, lower is worse)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_blocklist_hits&lt;/code&gt; (count of lists flagging the IP)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy_last_check_timestamp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_bitbrowser_profile_flags_24h&lt;/code&gt; (from the fleet feedback loop)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy_bitbrowser_session_failures_24h&lt;/code&gt; (from the fleet feedback loop)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eleven metrics, one label set per IP, roughly 11,000 time series for a 1,000-IP pool. Prometheus handles that on a t3.medium without breaking a sweat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Proxy pool (Proxy-Seller, IPRoyal, Bright Data, ...)
                    │
                    ▼
   ┌───────────────────────────────┐
   │      Check worker (Node.js)   │
   │  ─ Round-robin scheduler       │
   │  ─ HTTP probe (via proxy)      │
   │  ─ Geo lookup (ipinfo.io)      │
   │  ─ Reputation lookup           │
   │  ─ Prometheus /metrics         │
   └───────────────┬───────────────┘
                   │  scrape /metrics every 15s
                   ▼
   ┌───────────────────────────────┐
   │        Prometheus              │
   │  ─ 30d retention               │
   │  ─ Alertmanager rules          │
   └───────────────┬───────────────┘
                   │
                   ▼
   ┌───────────────┴───────────────┐
   │            Grafana             │
   │  ─ Pool overview               │
   │  ─ IP drill-down               │
   │  ─ Provider comparison         │
   └────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One check worker per 500 IPs. Two workers cover a 1,000-IP pool with room to spare. Prometheus scrapes both workers on the same interval so metrics stay aligned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check worker
&lt;/h2&gt;

&lt;p&gt;Node.js with &lt;code&gt;axios&lt;/code&gt;, &lt;code&gt;prom-client&lt;/code&gt;, and a small round-robin queue. The core loop for one proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HttpsProxyAgent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https-proxy-agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prom-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proxyUp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Gauge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proxy_up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;help&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1 if the proxy answered, 0 otherwise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;labelNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proxy_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;provider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;geo_expected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proxyLatency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Histogram&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proxy_latency_ms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;help&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Round-trip latency to the probe endpoint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;labelNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proxy_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;provider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;buckets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HttpsProxyAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;proxy_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;geo_expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geo&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://ipinfo.io/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;httpsAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;proxyUp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;proxyLatency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;proxy_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;proxyUp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The probe endpoint is &lt;code&gt;ipinfo.io/json&lt;/code&gt; because it returns IP, country, region, city, and ASN in a single call. Free tier gives 50,000 requests per month, enough for a 1,000-IP pool checked every 5 minutes.&lt;/p&gt;

&lt;p&gt;Reputation lookups are more expensive. Batch them: pull every distinct IP from the pool once per hour, hit IPQualityScore or Scamalytics in bulk mode, cache results for 60 minutes in Redis. This keeps the reputation API bill under $30/month even at 1,000 IPs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage choice
&lt;/h2&gt;

&lt;p&gt;Prometheus over InfluxDB, TimescaleDB, or Victoria Metrics for a pool this size. Reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The metric cardinality (11 metrics × 1,000 IPs = 11k series) sits comfortably in the middle of Prometheus's sweet spot&lt;/li&gt;
&lt;li&gt;Grafana's Prometheus data source is the most polished&lt;/li&gt;
&lt;li&gt;The Prometheus query language handles the "IPs currently dead" and "IPs that failed 3 checks in a row" queries in one line each&lt;/li&gt;
&lt;li&gt;Alertmanager ships with Prometheus and needs no extra binary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retention: 30 days. Anything older than a month is not useful for triage and takes up disk. If you need long-term trends, export daily aggregates to a Postgres table and query that instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Grafana dashboard
&lt;/h2&gt;

&lt;p&gt;Four panels. That is it. Adding more panels reduces incident response speed, not increases it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Panel 1: Pool health heatmap.&lt;/strong&gt; X-axis is time (last 6 hours). Y-axis is &lt;code&gt;proxy_id&lt;/code&gt;. Cell color is &lt;code&gt;proxy_up&lt;/code&gt;. A sudden vertical stripe of red means a provider outage. A slowly growing pattern of red dots means IPs are being burned individually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Panel 2: Failed-probe rate per provider.&lt;/strong&gt; Line graph, one line per provider (Proxy-Seller, IPRoyal, NetNut, DataImpulse). Y-axis is &lt;code&gt;(1 - avg(proxy_up)) * 100&lt;/code&gt;. Any line crossing 8% is a signal to open a support ticket with that provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Panel 3: Geo drift table.&lt;/strong&gt; A table of IPs where &lt;code&gt;proxy_geo_country != geo_expected&lt;/code&gt;. If a US IP starts resolving to Panama, remove it from the pool immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Panel 4: Correlation with BitBrowser flags.&lt;/strong&gt; Scatter plot: X-axis is &lt;code&gt;proxy_reputation_score&lt;/code&gt;, Y-axis is &lt;code&gt;proxy_bitbrowser_profile_flags_24h&lt;/code&gt;. The cluster of high-flag / low-reputation IPs in the bottom-right is your daily kill list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alertmanager rules
&lt;/h2&gt;

&lt;p&gt;Three alerts, no more. Every additional alert dilutes the ones that matter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proxy-health&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ProxyPoolDegraded&lt;/span&gt;
    &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;(1 - avg by (provider) (proxy_up)) &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;0.08&lt;/span&gt;
    &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10m&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;warning&lt;/span&gt;
    &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$labels.provider&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pool&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;gt;8%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;down&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;minutes"&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ProxyGeoDrift&lt;/span&gt;
    &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;count(proxy_geo_country != on(proxy_id) group_left proxy_geo_expected) &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;
    &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5m&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;warning&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ProxyReputationCollapse&lt;/span&gt;
    &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;avg by (provider) (proxy_reputation_score) &amp;lt; &lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;
    &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15m&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Route them to a dedicated Slack channel that only fires on proxy issues. Muted-by-default. Anyone whose account gets flagged checks that channel first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feeding the signal back into BitBrowser
&lt;/h2&gt;

&lt;p&gt;The dashboard is not the endpoint. It is the input to a decision loop. A small service (also Node.js, also under 300 lines) subscribes to Prometheus queries every 5 minutes and, for any IP flagged as &lt;code&gt;unhealthy&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calls the BitBrowser LocalAPI to find every profile bound to that IP&lt;/li&gt;
&lt;li&gt;Marks each profile as &lt;code&gt;proxy_stale&lt;/code&gt; in a local database&lt;/li&gt;
&lt;li&gt;Prevents the dispatcher from opening those profiles until a new IP is assigned&lt;/li&gt;
&lt;li&gt;Requests a fresh IP from the provider's rotation API&lt;/li&gt;
&lt;li&gt;Updates the profile via &lt;code&gt;/browser/update&lt;/code&gt; with the new proxy config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This closes the loop. A dying IP takes profiles offline in under 5 minutes instead of after a user complaint. Protocol-level nuances (why HTTP vs SOCKS5 vs Shadowsocks matter here, especially for mobile carrier detection) are covered in &lt;a href="https://hackmd.io/@DigitalGrowthPro/proxy-protocol-comparison-http-socks5-shadowsocks" rel="noopener noreferrer"&gt;this proxy protocol comparison&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where cloud phones fit in the same pipeline
&lt;/h2&gt;

&lt;p&gt;Mobile pools have a different failure mode: the phone itself can be fine while the carrier's IP block goes on Snapchat's ban list. Extending the dashboard to cover &lt;a href="https://www.bitbrowser.net/cloudphone" rel="noopener noreferrer"&gt;BitCloudPhone Android&lt;/a&gt; and &lt;a href="https://www.bitbrowser.net/cloudphone-ios" rel="noopener noreferrer"&gt;BitCloudPhone iOS&lt;/a&gt; devices means adding two more probe types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App-store reachability check.&lt;/strong&gt; Every 15 minutes, from each cloud phone, hit the App Store or Play Store discovery endpoint. A 403 or 429 means the device's carrier IP is soft-blocked at the app layer, invisible from web-only probes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-app CAPTCHA rate.&lt;/strong&gt; Track how often accounts running on a given device hit CAPTCHAs. Above a threshold, cycle the device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both probes return the same Prometheus metric names with a &lt;code&gt;platform=ios&lt;/code&gt; or &lt;code&gt;platform=android&lt;/code&gt; label. One dashboard covers three worlds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling notes
&lt;/h2&gt;

&lt;p&gt;The stack above sizes to roughly 5,000 IPs on a single Prometheus instance and a two-worker check fleet. Beyond that:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Bottleneck&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check worker&lt;/td&gt;
&lt;td&gt;Node event loop under 2,000 concurrent HTTP calls&lt;/td&gt;
&lt;td&gt;Split into worker pool via &lt;code&gt;piscina&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prometheus&lt;/td&gt;
&lt;td&gt;Series cardinality above 100k&lt;/td&gt;
&lt;td&gt;Shard by provider onto separate Prometheus instances&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reputation API&lt;/td&gt;
&lt;td&gt;Cost per lookup&lt;/td&gt;
&lt;td&gt;Extend cache TTL, batch harder, drop reputation for internal-only pools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grafana&lt;/td&gt;
&lt;td&gt;Panel query time above 3 seconds&lt;/td&gt;
&lt;td&gt;Add recording rules for expensive expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 10,000 IPs the architecture pattern is the same, the numbers on each box change.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which reputation service is worth paying for?&lt;/strong&gt;&lt;br&gt;
IPQualityScore for general fraud scoring, Scamalytics for stricter e-commerce use cases, and MaxMind minFraud when payment risk is the specific concern. All three have similar accuracy; the choice comes down to which one your target platforms use themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I skip reputation checks entirely?&lt;/strong&gt;&lt;br&gt;
For internal automation that never touches a payment gateway or an identity-verification vendor, yes. For anything that touches Stripe, Facebook Ads, or account creation on a Tier-1 platform, no. The reputation check catches issues 24-48 hours before the destination platform's own risk engine does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if my proxy provider does not expose sticky sessions?&lt;/strong&gt;&lt;br&gt;
The dashboard still works, but the metric labeling shifts. Instead of &lt;code&gt;proxy_id&lt;/code&gt;, label by &lt;code&gt;session_token&lt;/code&gt; and expect a much higher series churn. Prometheus handles it up to about 20,000 unique tokens per hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I probe from the same geo as the proxy claims to be in?&lt;/strong&gt;&lt;br&gt;
For most checks the probe origin does not matter — &lt;code&gt;ipinfo.io&lt;/code&gt; returns the same data whichever direction the query comes from. For app-store and CAPTCHA checks, the probe must originate from the proxy itself; that is what the cloud phone probes cover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this replace the proxy provider's own dashboard?&lt;/strong&gt;&lt;br&gt;
Yes, and you should stop trusting the provider's dashboard the day you have your own. Provider dashboards report internal health. What matters is what the destination platforms see, and only your own probes measure that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to take it from here
&lt;/h2&gt;

&lt;p&gt;Start with 50 IPs from one provider and the four Grafana panels. Prove the check worker stays under 10% CPU. Prove the alert rules fire on real outages, not on transient blips. Then add the second provider, then the third, then the cloud phone probes.&lt;/p&gt;

&lt;p&gt;Every monitoring stack I have shipped in production started as one worker checking one pool with two panels. The stack that tried to cover everything from day one is still in a Git branch nobody merged.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Affiliate disclosure: This post contains affiliate links. If you sign up for a paid BitBrowser or BitCloudPhone plan through the links above, I may earn a small commission at no additional cost to you. All numbers above come from monitoring stacks I run against my own paid accounts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>grafana</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Wildberries Multi-Seller: A Complete Guide to the Anti-Detect Browser</title>
      <dc:creator>yooexo</dc:creator>
      <pubDate>Tue, 18 Aug 2026 17:36:26 +0000</pubDate>
      <link>https://dev.to/yooexo/wildberries-multi-seller-a-complete-guide-to-the-anti-detect-browser-23ak</link>
      <guid>https://dev.to/yooexo/wildberries-multi-seller-a-complete-guide-to-the-anti-detect-browser-23ak</guid>
      <description>&lt;p&gt;Wildberries blocked over &lt;strong&gt;14,000 seller accounts&lt;/strong&gt; in Q1 2026 alone, according to their published seller report. Most of those bans weren't for fake products or review fraud. They were triggered by what the platform calls "associated account detection": two or more stores sharing the same device fingerprint, IP range, or browser session data.&lt;/p&gt;

&lt;p&gt;If you run more than one Wildberries store, or you're planning to, this guide covers the exact tools and setup that keep accounts isolated. You need an antidetect browser for desktop management, a cloud phone for mobile app access, and a dedicated Russian residential proxy per account. Read on for the specifics.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is an antidetect browser, and why do Wildberries sellers need one?
&lt;/h2&gt;

&lt;p&gt;A regular browser (Chrome, Firefox, Safari) sends a fingerprint to every website you visit. That fingerprint includes your screen resolution, installed fonts, canvas rendering hash, WebGL vendor string, time zone, language settings, and about 40 other parameters. Wildberries logs this fingerprint when you log into the seller portal.&lt;/p&gt;

&lt;p&gt;Open a second Wildberries seller account on the same device and the same browser, the fingerprint matches. Their system flags both accounts as related and suspends them simultaneously.&lt;/p&gt;

&lt;p&gt;An antidetect browser solves this by creating &lt;strong&gt;isolated browser profiles&lt;/strong&gt;, each with its own fabricated fingerprint. Account A runs in Profile 1, which shows a Windows 10 machine with a 1920×1080 screen, Calibri font, and a specific canvas hash. Account B runs in Profile 2: different OS, different screen resolution, different canvas signature. Each profile stores cookies and local storage separately, so there's no bleed between sessions.&lt;/p&gt;

&lt;p&gt;The antidetect browser doesn't just change the user-agent string. That's what incognito mode does, and it doesn't work. It replaces the entire device identity at the API level.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fus77hzro4z3tiy8f4ske.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fus77hzro4z3tiy8f4ske.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How Wildberries actually detects related seller accounts
&lt;/h2&gt;

&lt;p&gt;Before setting up anything, it helps to know what you're defending against. Wildberries' association detection looks at several layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser fingerprint matching.&lt;/strong&gt; Canvas hash, WebGL renderer, AudioContext fingerprint, font enumeration, and screen parameters. Two accounts with identical values on three or more of these get flagged automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP address correlation.&lt;/strong&gt; Two accounts logging in from the same IP address on the same day is a hard trigger. Even if the fingerprints differ, shared IPs create an "association chain" in their system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cookie and localStorage sharing.&lt;/strong&gt; If your browsers share session cookies (common when running multiple tabs), account A's session data can leak into account B's requests. Regular Chrome profiles don't isolate these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behavioral timing patterns.&lt;/strong&gt; Wildberries tracks login times. If Account A and Account B both log in every morning between 9:00 and 9:05 Moscow time from the same approximate IP range, their system marks that as suspicious even without a direct fingerprint match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment method overlap.&lt;/strong&gt; Accounts that list the same bank card, phone number, or OGRN get linked in their seller database regardless of technical isolation. This one has nothing to do with browsers. It's a business data problem.&lt;/p&gt;

&lt;p&gt;A proper antidetect browser handles the first three. A proxy handles the fourth (partially). Business data separation handles the fifth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which antidetect browser works best for Wildberries in 2026?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.bitbrowser.net" rel="noopener noreferrer"&gt;BitBrowser&lt;/a&gt; is the strongest option for Wildberries multi-seller setups right now, and it holds that position for three specific reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, it supports Russian-locale fingerprints natively.&lt;/strong&gt; You can set the browser language to &lt;code&gt;ru-RU&lt;/code&gt;, the time zone to &lt;code&gt;Europe/Moscow&lt;/code&gt;, and the keyboard layout to Russian inside each profile. When Wildberries reads your browser's &lt;code&gt;navigator.language&lt;/code&gt; property, it gets &lt;code&gt;ru-RU&lt;/code&gt; instead of something that contradicts your Russian IP. Mismatched locale and IP is one of the easier ways to get flagged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, BitBrowser has a free tier with up to 10 profiles.&lt;/strong&gt; That covers most Wildberries multi-sellers who run 3 to 8 stores. You don't need to pay to test the setup or run a small operation. Paid plans start at around $10 per month for more profiles and team access features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, it passes standard fingerprint audit tools.&lt;/strong&gt; Running a fresh BitBrowser profile through BrowserLeaks, CreepJS, and Pixelscan should show no automation flags, no WebDriver property exposed, and no canvas or WebGL anomalies. Test this before you log into any real account.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F15ek4f7hgao8zsdefxcs.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F15ek4f7hgao8zsdefxcs.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The setup process for a Wildberries profile in BitBrowser takes about 4 minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new profile. Name it after the store (e.g., "WB Store 2: Electronics").&lt;/li&gt;
&lt;li&gt;Set OS to Windows 10 or Windows 11. Russian sellers overwhelmingly use Windows, so matching that reduces fingerprint suspicion.&lt;/li&gt;
&lt;li&gt;Set language to &lt;code&gt;ru-RU&lt;/code&gt;, time zone to &lt;code&gt;Europe/Moscow&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Assign your proxy (covered in the next section).&lt;/li&gt;
&lt;li&gt;Open the profile, go to &lt;code&gt;browserleaks.com&lt;/code&gt;, and confirm the IP, locale, and time zone all match before logging in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One thing to do before running the profile: open &lt;code&gt;chrome://settings/&lt;/code&gt; inside the profile and disable any auto-fill or sync features. BitBrowser profiles are isolated from Chrome sync, but disabling it explicitly prevents unexpected data requests.&lt;/p&gt;


&lt;h2&gt;
  
  
  What proxy setup do you need for Wildberries accounts?
&lt;/h2&gt;

&lt;p&gt;The proxy choice matters as much as the browser. A good antidetect browser with a bad proxy still gets flagged. For Wildberries, the rules are clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Russian residential proxies.&lt;/strong&gt; Wildberries is headquartered in Moscow and most of its seller base operates from Russian ISPs. A login from a US datacenter IP triggers immediate scrutiny. A residential IP from Rostelecom or MTS looks like a normal Russian internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One dedicated IP per account.&lt;/strong&gt; Shared proxy pools rotate IPs between users, which means Account A might occasionally get the same exit IP as another seller's Account B. Dedicated IPs cost a bit more but the isolation is worth it for accounts generating real revenue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For mobile app access, use Russian mobile proxies.&lt;/strong&gt; 4G proxies from Russian mobile carriers (MTS, Megafon, Beeline) give you a mobile ASN, which matches the expected IP type when logging in through a phone or cloud phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This dev.to article covers how to architect proxy rotation if you're managing a larger number of accounts programmatically:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/digitalgrowthpro/building-a-proxy-rotation-system-for-web-automation-architecture-patterns-and-implementation-1l8m" class="crayons-story__hidden-navigation-link"&gt;Building a Proxy Rotation System for Web Automation: Architecture Patterns and Implementation&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/digitalgrowthpro" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3576363%2F33253307-d026-4f2c-a9a6-a0f3fd7bdefa.jpg" alt="digitalgrowthpro profile" class="crayons-avatar__image" width="800" height="770"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/digitalgrowthpro" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Digital Growth Pro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Digital Growth Pro
                
                
              
              &lt;div id="story-author-preview-content-3170008" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/digitalgrowthpro" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3576363%2F33253307-d026-4f2c-a9a6-a0f3fd7bdefa.jpg" class="crayons-avatar__image" alt="" width="800" height="770"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Digital Growth Pro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/digitalgrowthpro/building-a-proxy-rotation-system-for-web-automation-architecture-patterns-and-implementation-1l8m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 13&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/digitalgrowthpro/building-a-proxy-rotation-system-for-web-automation-architecture-patterns-and-implementation-1l8m" id="article-link-3170008"&gt;
          Building a Proxy Rotation System for Web Automation: Architecture Patterns and Implementation
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/proxy"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;proxy&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/digitalgrowthpro/building-a-proxy-rotation-system-for-web-automation-architecture-patterns-and-implementation-1l8m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;For manual multi-seller setups, you just need static residential IPs, one per account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assigning the proxy in BitBrowser:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the profile settings, click the &lt;strong&gt;Proxy&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;SOCKS5&lt;/strong&gt; (preferred) or HTTP.&lt;/li&gt;
&lt;li&gt;Enter the IP, port, username, and password from your proxy provider.&lt;/li&gt;
&lt;li&gt;Save, then click &lt;strong&gt;Check Proxy&lt;/strong&gt; inside BitBrowser. It shows you the resolved IP and country. Confirm it shows &lt;code&gt;RU&lt;/code&gt; before using the profile.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Do you need a cloud phone for Wildberries?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0enpfz3zxwtwxcumitbw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0enpfz3zxwtwxcumitbw.webp" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desktop browser management covers the Wildberries Partner Portal (&lt;code&gt;partners.wildberries.ru&lt;/code&gt;) but the mobile app is a separate channel. Many sellers use the Wildberries Seller app on iOS or Android to handle order fulfillment, buyer messages, and listing updates. The app fingerprints the device separately from the browser: UDID, device model, OS version, and screen resolution.&lt;/p&gt;

&lt;p&gt;Log into two different Wildberries seller accounts from the same physical iPhone and those accounts get linked at the device level. The fix is a cloud phone: a virtual mobile device hosted remotely, with its own isolated device identity and a separate IP assignment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitbrowser.net/cloudphone" rel="noopener noreferrer"&gt;BitCloudPhone&lt;/a&gt; (Android) and &lt;a href="https://www.bitbrowser.net/cloudphone-ios" rel="noopener noreferrer"&gt;BitCloudPhone iOS&lt;/a&gt; handle this for Wildberries sellers. Each cloud phone instance has its own device fingerprint, its own app environment, and accepts its own proxy assignment. You run it from your regular browser and it presents as a completely separate physical device to Wildberries.&lt;/p&gt;

&lt;p&gt;The iOS version specifically matters for the Russian market because iOS penetration among Russian e-commerce buyers and sellers is high. Wildberries iOS app updates ship regularly and sometimes add new device checks. BitCloudPhone iOS keeps pace with those updates. You're not jailbreaking a phone or running an emulator that an app can detect as virtual. The cloud phone environment is designed to look like real device hardware.&lt;/p&gt;

&lt;p&gt;For a Wildberries multi-seller operation running 5 stores, the typical setup is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Per account&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Partner Portal (desktop)&lt;/td&gt;
&lt;td&gt;BitBrowser profile&lt;/td&gt;
&lt;td&gt;1 Russian residential IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile seller app&lt;/td&gt;
&lt;td&gt;BitCloudPhone iOS&lt;/td&gt;
&lt;td&gt;1 Russian 4G mobile IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You access both from the same laptop. The cloud phones are remote, so there's no local hardware fingerprint from your actual machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  What account-level separation does Wildberries require?
&lt;/h2&gt;

&lt;p&gt;Technical isolation through an antidetect browser gets you past fingerprint detection. Business data separation keeps you clean at the account-record level. These are different problems.&lt;/p&gt;

&lt;p&gt;For each Wildberries seller account, Wildberries stores: the seller's legal entity (IP or OOO), the OGRN/OGRNIP number, the bank account tied to payouts, the phone number for verification, and the email address. Accounts sharing any of these get linked in Wildberries' seller database regardless of how well your browser profiles are isolated.&lt;/p&gt;

&lt;p&gt;Each store needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its own phone number for SMS verification&lt;/li&gt;
&lt;li&gt;Its own email address (different domain if possible; similar patterns like &lt;code&gt;store1@gmail.com&lt;/code&gt; and &lt;code&gt;store2@gmail.com&lt;/code&gt; draw less scrutiny than exact matches, but separate domains are cleaner)&lt;/li&gt;
&lt;li&gt;Its own payout bank card or account&lt;/li&gt;
&lt;li&gt;Its own legal entity (IP or OOO registration with a unique OGRN)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most Russian multi-sellers operating legally use separate sole proprietor (IP) registrations or different OOO entities. The point is that the paper trail for each account has to be genuinely distinct.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to warm up a new Wildberries seller account
&lt;/h2&gt;

&lt;p&gt;Wildberries treats brand-new seller accounts with a lower trust score. Account-association detection is more sensitive during the first 30 days. Three things help here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log in gradually at first.&lt;/strong&gt; Don't open all 5 accounts on day one. Start with one, let it run for a week with normal activity, then add the second account, and so on. Accounts that start simultaneously from different profiles on the same day raise a pattern flag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Match your activity hours to the account's supposed location.&lt;/strong&gt; If the account's store is listed as being based in Novosibirsk (UTC+7), seller login activity should happen during Novosibirsk business hours, not 2:00 AM Moscow time. BitBrowser lets you set the time zone per profile. Use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't copy listings between accounts during the warm-up period.&lt;/strong&gt; Two accounts listing the exact same product with the exact same title, photos, and description on the same day. Wildberries' content matching system flags them as related. Differentiate the listings even for the same product: different main image, different title structure, different keyword emphasis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Browser automation for Wildberries: is it worth it?
&lt;/h2&gt;

&lt;p&gt;Some sellers automate Wildberries seller tasks: bulk listing uploads, price updates, stock adjustments. BitBrowser exposes a local REST API that automation tools can call to create profiles, assign proxies, and open sessions. You can build scripts using Selenium, Playwright, or Puppeteer that connect to BitBrowser's existing browser instances rather than launching a detectable headless browser.&lt;/p&gt;

&lt;p&gt;The advantage of going through BitBrowser's API rather than directly launching Playwright is that the browser instance already has a full human fingerprint. A standard &lt;code&gt;playwright.chromium.launch(headless=True)&lt;/code&gt; exposes the &lt;code&gt;navigator.webdriver&lt;/code&gt; flag that Wildberries can read. A session launched through BitBrowser's API inherits the profile's fingerprint and doesn't set that flag.&lt;/p&gt;

&lt;p&gt;This dev.to article walks through the technical connection pattern for setting up automated sessions with real fingerprints:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/digitalgrowthpro/bitbrowser-selenium-setting-up-automated-browser-sessions-with-real-fingerprints-48i" class="crayons-story__hidden-navigation-link"&gt;BitBrowser + Selenium: Setting Up Automated Browser Sessions with Real Fingerprints&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/digitalgrowthpro" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3576363%2F33253307-d026-4f2c-a9a6-a0f3fd7bdefa.jpg" alt="digitalgrowthpro profile" class="crayons-avatar__image" width="800" height="770"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/digitalgrowthpro" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Digital Growth Pro
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Digital Growth Pro
                
                
              
              &lt;div id="story-author-preview-content-3512272" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/digitalgrowthpro" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3576363%2F33253307-d026-4f2c-a9a6-a0f3fd7bdefa.jpg" class="crayons-avatar__image" alt="" width="800" height="770"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Digital Growth Pro&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/digitalgrowthpro/bitbrowser-selenium-setting-up-automated-browser-sessions-with-real-fingerprints-48i" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 16&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/digitalgrowthpro/bitbrowser-selenium-setting-up-automated-browser-sessions-with-real-fingerprints-48i" id="article-link-3512272"&gt;
          BitBrowser + Selenium: Setting Up Automated Browser Sessions with Real Fingerprints
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/selenium"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;selenium&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/digitalgrowthpro/bitbrowser-selenium-setting-up-automated-browser-sessions-with-real-fingerprints-48i#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;For most Wildberries multi-sellers, full automation isn't necessary. Manual management of 5 to 8 accounts through BitBrowser profiles takes maybe 90 minutes per day across all stores. Automation becomes worthwhile at 15+ accounts or when you need bulk price updates across hundreds of SKUs.&lt;/p&gt;




&lt;h2&gt;
  
  
  What happens if one account gets flagged?
&lt;/h2&gt;

&lt;p&gt;Set up proper isolation and one account still gets a warning or temporary suspension, the other accounts shouldn't be dragged down with it. That's the entire point of isolation. With a proper antidetect browser setup and separate proxies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The flagged account's cookie data doesn't exist in other profiles&lt;/li&gt;
&lt;li&gt;Each account's IP is dedicated, so it can't be traced to other accounts' IPs&lt;/li&gt;
&lt;li&gt;Each profile fingerprint is unique, so Wildberries can't find matches to other stores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The investigation stays contained. You lose one account, not all five.&lt;/p&gt;

&lt;p&gt;Without isolation, running everything on Chrome with a VPN toggle means a single suspension investigation can unravel every related account, because Wildberries can trace the shared fingerprint and IP history through their logs. That's how sellers lose entire portfolios at once.&lt;/p&gt;




&lt;h2&gt;
  
  
  Russian marketplace multi-account management: same rules apply
&lt;/h2&gt;

&lt;p&gt;Everything covered here transfers to Ozon, Avito, and Yandex Market. All three use fingerprinting and IP correlation to detect related accounts. That antidetect browser + Russian residential proxy + separate business data stack works across all of them.&lt;/p&gt;

&lt;p&gt;Wildberries differs from those platforms in one specific way: the mobile app requirement. More Wildberries sellers manage day-to-day operations through the app than through the Partner Portal web interface. That's why the cloud phone component matters more for Wildberries than it does for Ozon, which has a more complete web-based seller interface.&lt;/p&gt;

&lt;p&gt;For sellers managing accounts on multiple Russian marketplaces simultaneously, one practical approach is to extend the naming convention: "WB Store 1," "Ozon Store 1," "Avito Account 1": each gets its own BitBrowser profile and its own proxy, clearly labeled so there's no confusion about which account is active in which profile.&lt;/p&gt;




&lt;h2&gt;
  
  
  What does a full Wildberries multi-seller setup cost?
&lt;/h2&gt;

&lt;p&gt;Here's a rough monthly cost breakdown for running 5 stores:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BitBrowser paid plan (10+ profiles)&lt;/td&gt;
&lt;td&gt;~$10–$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 dedicated Russian residential proxies&lt;/td&gt;
&lt;td&gt;~$30–$60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BitCloudPhone iOS (5 instances)&lt;/td&gt;
&lt;td&gt;varies by plan, &lt;a href="https://www.bitbrowser.net/cloudphone-ios" rel="noopener noreferrer"&gt;check here&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 virtual phone numbers for verification&lt;/td&gt;
&lt;td&gt;~$5–$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$50–$120&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Against the revenue that 5 active Wildberries stores generate, that's a small operational cost. Losing all accounts to a single suspension wave costs significantly more.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is an antidetect browser and why do Wildberries sellers need one?
&lt;/h3&gt;

&lt;p&gt;An antidetect browser replaces your real device fingerprint with a separate, isolated profile for each session. Wildberries uses fingerprinting to detect related accounts sharing the same device. Running two stores from one regular browser gets both flagged. BitBrowser assigns each store its own unique fingerprint, so the platform sees two completely different devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  How many Wildberries accounts can I safely run with BitBrowser?
&lt;/h3&gt;

&lt;p&gt;BitBrowser's free tier supports up to 10 isolated profiles. Paid plans start around $10/month and scale to hundreds of profiles. Most Wildberries multi-sellers run 3 to 8 accounts per operator without issues, pairing each profile with a dedicated Russian residential IP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a cloud phone to manage Wildberries accounts?
&lt;/h3&gt;

&lt;p&gt;Not for the Partner Portal, but yes for the mobile seller app. The iOS and Android apps use device fingerprinting that a desktop browser can't replicate. &lt;a href="https://www.bitbrowser.net/cloudphone" rel="noopener noreferrer"&gt;BitCloudPhone&lt;/a&gt; and &lt;a href="https://www.bitbrowser.net/cloudphone-ios" rel="noopener noreferrer"&gt;BitCloudPhone iOS&lt;/a&gt; give each account a completely separate device identity, without needing multiple physical phones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which proxy type works best for Wildberries multi-seller accounts?
&lt;/h3&gt;

&lt;p&gt;Russian residential proxies, one dedicated IP per account. For mobile app access, Russian 4G mobile proxies match the expected mobile ASN. Shared proxies and datacenter IPs both get flagged faster for Wildberries seller logins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Wildberries detect BitBrowser?
&lt;/h3&gt;

&lt;p&gt;BitBrowser is designed to pass standard fingerprint tests including BrowserLeaks, CreepJS, and Pixelscan. The key is pairing each browser profile with a matching residential proxy and not reusing fingerprint parameters across accounts. Test every new profile before using it on a real account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is using multiple Wildberries accounts against the platform's rules?
&lt;/h3&gt;

&lt;p&gt;Wildberries prohibits one legal entity from operating multiple accounts to exploit promotional systems. Separate legal entities operating separate stores is common practice. The requirement is true isolation: different IPs, different devices or browser profiles, different payment methods, and no shared registration data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is BitCloudPhone iOS and how does it help Wildberries sellers?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.bitbrowser.net/cloudphone-ios" rel="noopener noreferrer"&gt;BitCloudPhone iOS&lt;/a&gt; is a cloud-hosted iPhone environment. Each instance has its own iOS device fingerprint, UDID, and IP. For sellers managing orders through the iOS Wildberries app, it removes the need for multiple physical phones. Assign a Russian mobile IP and it presents as a real Russian iPhone to Wildberries.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I set up a Russian residential proxy in BitBrowser?
&lt;/h3&gt;

&lt;p&gt;Open your BitBrowser profile settings, go to the Proxy tab, select SOCKS5, paste in your &lt;code&gt;IP:port:user:pass&lt;/code&gt;, and set the location tag to &lt;code&gt;RU&lt;/code&gt;. Save and run a leak test at &lt;code&gt;browserleaks.com&lt;/code&gt; before logging into any Wildberries seller account. The IP shown should be a Russian residential address, not a datacenter range.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Wildberries' detection systems have gotten more precise over the past 18 months. Sellers getting caught aren't running 10 accounts behind a VPN (Wildberries handled that threat years ago). Sophisticated operators are losing accounts now because they missed one layer of isolation: a shared mobile device, a proxy pool that occasionally assigns duplicate IPs, or business registration data that creates a traceable link between otherwise technically separated accounts.&lt;/p&gt;

&lt;p&gt;BitBrowser profiles with Russian residential IPs for the Partner Portal, BitCloudPhone iOS instances with Russian 4G IPs for the mobile app, and genuinely separate business registration data per account. This closes those gaps. Start with the free BitBrowser tier to validate the fingerprint isolation before investing in cloud phones, then scale once you've confirmed the setup passes fingerprint tests.&lt;/p&gt;

&lt;p&gt;For a wider comparison of antidetect browsers beyond Wildberries use cases:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://gotoproxy.com/2026/08/16/best-anti-detect-browsers-in-2026/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgotoproxy.com%2Fwp-content%2Fuploads%2F2026%2F08%2FBest-Anti-Detect-Browsers-in-2026.webp" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://gotoproxy.com/2026/08/16/best-anti-detect-browsers-in-2026/" rel="noopener noreferrer" class="c-link"&gt;
            Best Anti-Detect Browsers in 2026: Why BitBrowser Took the Top Spot This Year - GoToProxy - Expert Proxy Service Reviews &amp;amp; Privacy Tools
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Best Anti-Detect Browsers in 2026: Why BitBrowser Took the Top Spot This Year A hands-on ranking of the 5 anti-detect browsers we tested across 26,400 profiles,
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgotoproxy.com%2Fwp-content%2Fuploads%2F2025%2F05%2Fcropped-gotoproxy.com-favicon-32x32.png" width="32" height="32"&gt;
          gotoproxy.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>russian</category>
    </item>
  </channel>
</rss>
