---
title: "Build SEO traffic forecasts that give leadership a range to plan against"
description: "Forecast organic traffic with decomposition, regression, SARIMA, and Prophet, then report ranges, scenarios, and assumptions that leadership can plan against."
canonical: "https://scalewithsearch.com/articles/seo-forecasting-models"
date: "2026-03-20"
modified: "2026-10-02"
---
## Site navigation

- [Scale With Search](https://scalewithsearch.com/)
- Real estate
  - Real estate
    - [Real estate](https://scalewithsearch.com/for/real-estate)
- Work
  - Start here
    - [Send your brief](https://scalewithsearch.com/work#send-your-brief)
    - [Prepare your six-question brief](https://scalewithsearch.com/work#prepare-your-six-question-brief)
  - Build
    - [Site build, content library with SEO, signal desk](https://scalewithsearch.com/work)
- For your business
  - Trades and home services
    - [Auto body and collision shops](https://scalewithsearch.com/for/auto-body-and-collision-shops)
    - [Foundation and home repair contractors](https://scalewithsearch.com/for/foundation-and-home-repair)
    - [Garage door and fencing contractors](https://scalewithsearch.com/for/garage-door-and-fencing-contractors)
    - [HVAC contractors](https://scalewithsearch.com/for/hvac-contractors)
    - [Janitorial and commercial cleaning companies](https://scalewithsearch.com/for/janitorial-and-commercial-cleaning)
    - [Locksmiths](https://scalewithsearch.com/for/locksmiths)
    - [Moving companies](https://scalewithsearch.com/for/moving-companies)
    - [Pest control companies](https://scalewithsearch.com/for/pest-control-companies)
    - [Plumbing and electrical contractors](https://scalewithsearch.com/for/plumbing-and-electrical-contractors)
    - [Restoration and water or fire damage companies](https://scalewithsearch.com/for/restoration-and-water-fire-damage)
    - [Roofing companies](https://scalewithsearch.com/for/roofing-companies)
    - [Towing companies](https://scalewithsearch.com/for/towing-companies)
    - [Tree services and landscaping companies](https://scalewithsearch.com/for/tree-services-and-landscaping)
    - [Solar installers](https://scalewithsearch.com/for/solar-installation)
    - [General contractors](https://scalewithsearch.com/for/general-contractors-and-construction)
    - [Paving, concrete, and flooring contractors](https://scalewithsearch.com/for/paving)
  - Practices and professional services
    - [Bookkeeping and tax practices](https://scalewithsearch.com/for/bookkeeping-and-tax-practices)
    - [Dental practices](https://scalewithsearch.com/for/dental-practices)
    - [Family and criminal defense law firms](https://scalewithsearch.com/for/family-and-criminal-defense-law-firms)
    - [Med spas and aesthetics practices](https://scalewithsearch.com/for/med-spas-and-aesthetics)
    - [Personal injury law firms](https://scalewithsearch.com/for/personal-injury-law-firms)
    - [Veterinary clinics](https://scalewithsearch.com/for/veterinary-clinics)
    - [Gyms and fitness studios](https://scalewithsearch.com/for/fitness)
    - [Therapy and outpatient health practices](https://scalewithsearch.com/for/therapy-and-outpatient-health)
    - [Medical billing companies](https://scalewithsearch.com/for/medical-billing)
    - [Insurance agencies](https://scalewithsearch.com/for/insurance-agencies)
    - [Financial advisors](https://scalewithsearch.com/for/financial-advisors)
    - [Property management companies](https://scalewithsearch.com/for/property-management)
    - [Recruiting and staffing agencies](https://scalewithsearch.com/for/recruiting-and-staffing)
    - [Architects and interior designers](https://scalewithsearch.com/for/architects-and-interior-designers)
    - [Logistics and supply chain companies](https://scalewithsearch.com/for/logistics-and-supply-chain)
  - Agencies, MSPs, and manufacturing
    - [IT and managed service providers](https://scalewithsearch.com/for/it-and-managed-service-providers)
    - [Machine shops and precision manufacturers](https://scalewithsearch.com/for/machine-shops-and-precision-manufacturing)
    - [Marketing agencies and freelancers](https://scalewithsearch.com/for/marketing-agencies-and-freelancers)
    - [SEO agencies and consultants](https://scalewithsearch.com/for/seo-agencies-and-consultants)
    - [Small manufacturers and fabricators](https://scalewithsearch.com/for/small-manufacturers-and-fabricators)
  - Restaurants, shops, studios, and nonprofits
    - [Restaurants and hospitality businesses](https://scalewithsearch.com/for/restaurants-and-hospitality)
    - [Retail stores and ecommerce sellers](https://scalewithsearch.com/for/retail-and-ecommerce)
    - [Photographers, event planners, and travel agents](https://scalewithsearch.com/for/photographers)
    - [Churches and nonprofits](https://scalewithsearch.com/for/churches-and-nonprofits)
  - [All industries](https://scalewithsearch.com/for/)
- Learn
  - For your office
    - [Office job guides](https://scalewithsearch.com/guides/)
    - [Browser calculators](https://scalewithsearch.com/tools/)
  - Start here
    - [How it works](https://scalewithsearch.com/how-it-works)
    - [Free Starter Kit](https://scalewithsearch.com/kit/business-memory-starter-kit.zip)
    - [Synthetic specimen](https://scalewithsearch.com/specimen/working-session-specimen.zip)
  - Guides
    - [The Complete Guide to Business Memory for AI Agents](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [The Complete Small-Business Guide to AI Agent Governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [The Complete Guide to Leaving Vendor AI Memory](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - Articles by cluster
    - [Business memory](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [Agent governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [Migration and ownership](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - For machines
    - [llms.txt](https://scalewithsearch.com/llms.txt)
    - [llms-full.txt](https://scalewithsearch.com/llms-full.txt)
    - [Machine view](https://scalewithsearch.com/?view=machine)
- Company
  - Evidence
    - [Proof](https://scalewithsearch.com/proof)
  - Company
    - [About](https://scalewithsearch.com/about)

# Build SEO traffic forecasts that give leadership a range to plan against.

Someone asks you how much organic traffic the site will get next quarter. A straight line through last year's numbers gives an answer, and it is usually wrong.

A forecast model turns historical performance data into a projection of future organic traffic and revenue. It must account for three things that a straight line ignores:

- Seasonal patterns that repeat on the calendar.
- Growth trends that compound instead of adding a fixed amount each month.
- External shocks, such as algorithm updates or a new competitor, that disrupt both.

A useful forecast is not one number. It is a range with a stated confidence level and written assumptions. Suppose you tell executives "traffic will be 150,000 next quarter" and the number misses. They stop trusting the forecast. Suppose instead you say "traffic will likely fall between 130,000 and 170,000, with 75% confidence". They can plan around the uncertainty.

This page covers the data, four model types, algorithm risk, presentation, and validation. For the bottom-up keyword method and simulation, read [SEO forecasting for data analysts](/articles/seo-forecasting-models-data-analysts).

## Collect the data first

### Minimum data set

Collect these five inputs before you build a model:

| Input | Content | Why you need it |
|---|---|---|
| Google Search Console, available 16 months; 24 or more only from an existing archive | Monthly clicks and impressions by query and page | The primary data set. Two full annual cycles require an archive collected before standard history expires. |
| GA4, 24 months | Monthly organic sessions, conversions, and revenue if you sell online | Connects traffic to business results. |
| Competitor visibility trends | Monthly visibility scores from Ahrefs or Semrush for your domain and 3 to 5 competitors | Puts your results in the context of the market. |
| Algorithm update timeline | Dates of Google core updates, spam updates, and major search result feature changes | Lets you separate algorithm effects from organic growth. |
| Content publication log | Dates and types of content you published | Separates growth that came from content investment from other growth. |

[Google documents a 16-month standard Search Console view](https://developers.google.com/search/docs/monitor-debug/debugging-search-traffic-drops). An API export or bulk export extends your own archive only when you collect and retain it earlier. It cannot recover expired history on demand. The decomposition example below needs at least two full annual cycles. With less history, use a simpler baseline and disclose the missing seasonal evidence.

For a new site with no history, use a competitor proxy. Find a competitor that was at your current growth stage 24 months ago. Model your path against its historical growth. Adjust for your investment level and market conditions. The result is a rough estimate, not a precise forecast.

### Prepare the data

Aggregate to monthly values. Daily data holds too much noise for trend analysis. Weekly data has week boundaries that do not align with months. Monthly values smooth the noise and keep the seasonal signal.

Tag outlier months. An algorithm update, a viral article, a technical outage, or a tracking error can make one month unusual. Do not delete these months. Tag them, so that the model knows they exist but they do not distort the trend.

Separate branded and non-branded traffic. Branded traffic comes from searches for your company name. It follows marketing spend and brand campaigns. Non-branded traffic comes from searches for your products or topics. It follows SEO investment and content production. Forecast the two separately.

### Choose the metric

Forecast clicks from Google Search Console. Clicks are the most reliable organic metric. Then apply historical conversion rates and revenue per conversion to turn clicks into revenue. If you forecast revenue directly, conversion rate changes add variance to the model.

## Model 1: time series decomposition

Time series decomposition splits the traffic series into three parts:

- Trend: the long-term direction, without seasonal variation. A site that grows 3% each month has a positive trend, even in a seasonal dip.
- Seasonality: patterns that repeat on the calendar. Many businesses dip in December and peak in January. Others follow tax season, the school year, or holiday shopping.
- Residual: the variance that trend and seasonality do not explain. Large residuals on algorithm update dates confirm an algorithm effect. A pattern in the residuals shows that the model is wrong.

This example uses Python and `statsmodels`:

```python
from statsmodels.tsa.seasonal import seasonal_decompose
import pandas as pd

# Load monthly organic traffic data
df = pd.read_csv('organic_traffic.csv', parse_dates=['month'])
df.set_index('month', inplace=True)

# Multiplicative model: seasonal effects scale with traffic level
result = seasonal_decompose(df['clicks'], model='multiplicative', period=12)

trend = result.trend
seasonal = result.seasonal
residual = result.resid
```

The multiplicative model treats a seasonal effect as a proportion of the trend. A December dip is 15% of traffic, not a fixed number of lost clicks. Use it for a growing site, where seasonal variation grows with traffic volume.

To forecast, extend the trend part with linear or polynomial regression. Then apply the seasonal factors: `forecast = extrapolated_trend * seasonal_factor`.

This method works for a site with stable seasons and consistent growth. It fails when an external shock breaks the trend.

## Model 2: regression

### Simple linear regression

Model organic traffic as a linear function of time:

```python
import numpy as np
from sklearn.linear_model import LinearRegression

# X = month number (1, 2, 3...), y = organic clicks
X = np.arange(len(df)).reshape(-1, 1)
y = df['clicks'].values

model = LinearRegression()
model.fit(X, y)

# Forecast next 6 months
future_X = np.arange(len(df), len(df) + 6).reshape(-1, 1)
forecast = model.predict(future_X)
```

Simple linear regression captures the growth rate. It misses seasonality and nonlinear patterns. Use it as a baseline, not as the final model.

### Multiple regression with features

Add explanatory variables to improve accuracy:

- Month-of-year indicators. One binary variable for each month captures the seasonal pattern.
- Content volume. Use the article count from 3 to 6 months earlier, because content takes time to rank.
- New referring domains. Use the count from 2 to 4 months earlier, because links take time to affect rankings.
- Competitor visibility change. When competitors gain visibility, your traffic can fall with no action from you.

```python
features = pd.DataFrame({
    'month_num': np.arange(len(df)),
    'articles_published_lag3': df['articles'].shift(3),
    'new_domains_lag2': df['new_referring_domains'].shift(2),
    'competitor_visibility_delta': df['competitor_visibility'].diff()
}, index=df.index)

# Month is categorical, not a linear 1-to-12 effect.
month_categories = pd.Series(
    pd.Categorical(df.index.month, categories=range(1, 13)),
    index=df.index
)
month_indicators = pd.get_dummies(
    month_categories, prefix='month', drop_first=True, dtype=float
)
features = pd.concat([features, month_indicators], axis=1)
valid = features.notna().all(axis=1)
X = features.loc[valid]
y = df.loc[valid, 'clicks']
```

[Pandas dummy encoding](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html) makes January the reference month here. Use the same category list and column order for future rows. Enter future content, link, and competitor values as explicit scenario assumptions. Backtest whether these features improve on time alone.

### Report prediction intervals

Report a prediction interval for a future observation. A fixed multiplier of training residual error omits forecast-horizon effects and parameter uncertainty. Use the model's observation prediction interval, or calibrate error quantiles from rolling backtests at the same horizon.

For the second approach, save each held-out prediction with its horizon and actual result. Never fit on months beyond that prediction's origin. This example applies a central 75% range to a six-month point forecast:

```python
# CSV columns: horizon, actual, predicted, from rolling held-out forecasts.
backtest = pd.read_csv('rolling_backtest_errors.csv')
intervals = []
for horizon, point in enumerate(forecast, start=1):
    rows = backtest.loc[backtest['horizon'] == horizon]
    errors = (rows['actual'] - rows['predicted']).dropna()
    if len(errors) < 20:  # illustrative minimum, not a coverage guarantee
        raise ValueError(f'Insufficient calibration errors for horizon {horizon}')
    q_low, q_high = np.quantile(errors, [0.125, 0.875])
    intervals.append((point + q_low, point + q_high))
```

Check coverage on a separate later period: about 75% of actuals should fall inside a calibrated 75% interval. Report the observed count and sample size. Serially correlated errors or a changed market can invalidate that calibration. Widen the range or change the model when coverage fails.

## Model 3: SARIMA

SARIMA means seasonal autoregressive integrated moving average. It is the standard time series model for data with a trend and a seasonal part. It also handles autocorrelation, where this month's traffic depends on last month's traffic.

SARIMA needs 36 months of data or more, a clear seasonal pattern, and the skill to fit and validate the model.

```python
from statsmodels.tsa.statespace.sarimax import SARIMAX

# SARIMA(p,d,q)(P,D,Q,s): select parameters with auto-selection or grid search
model = SARIMAX(
    df['clicks'],
    order=(1, 1, 1),              # (p, d, q): non-seasonal part
    seasonal_order=(1, 1, 1, 12)  # (P, D, Q, s): seasonal part
)
results = model.fit()

# Forecast with confidence intervals
forecast = results.get_forecast(steps=6)
mean_forecast = forecast.predicted_mean
conf_int = forecast.conf_int(alpha=0.25)  # 75% confidence interval
```

To select parameters automatically, use `auto_arima` from the `pmdarima` library:

```python
import pmdarima as pm

auto_model = pm.auto_arima(
    df['clicks'],
    seasonal=True, m=12,
    stepwise=True,
    suppress_warnings=True
)
```

Validate the model before you use it. Hold back the last 6 months of data. Fit the model on the rest. Compare the forecast with the actual values. Mean absolute percentage error (MAPE) measures the accuracy.

## Model 4: Prophet

Prophet is an open-source forecasting library that Meta released. It handles several problems common in SEO data:

- More than one seasonal pattern, such as weekly and yearly.
- Holiday effects. You can enter algorithm updates as holidays.
- Missing data points.
- Changepoints, where the growth rate shifts.

```python
from prophet import Prophet

# Prophet requires columns named 'ds' (date) and 'y' (value)
prophet_df = df['clicks'].reset_index()
prophet_df.columns = ['ds', 'y']

# Enter algorithm updates as holidays. Replace these example dates
# with the update dates you observed in your own data.
algorithm_updates = pd.DataFrame({
    'holiday': 'google_update',
    'ds': pd.to_datetime(['2025-03-15', '2025-08-20', '2025-11-10']),
    'lower_window': 0,
    'upper_window': 30  # impact window of 30 days
})

model = Prophet(
    holidays=algorithm_updates,
    yearly_seasonality=True,
    changepoint_prior_scale=0.1  # regularization for trend changes
)
model.fit(prophet_df)

# Forecast 6 months; 'MS' matches month-start dates
future = model.make_future_dataframe(periods=6, freq='MS')
forecast = model.predict(future)
```

Prophet generates uncertainty intervals and finds trend changepoints automatically. Its charts are ready to use in [stakeholder reporting](/articles/seo-reporting-for-stakeholders).

## Account for algorithm update risk

### Measure past impact

For each Google core update in your data, compare traffic in the 30 days after the update with the 30 days before it. Record the percentage change. The set of changes shows your site's algorithm risk.

Suppose past updates moved traffic between -15% and +8%. Your forecast must allow for that range. Apply a risk discount to the base forecast:

`adjusted_forecast = forecast * (1 - probability_of_negative_update * average_negative_impact)`

### Adjust for AI Overviews

Track click-through rate (CTR) by query type in Google Search Console. If AI Overviews reduce CTR on information queries, apply a CTR decay factor to the information part of the forecast. Commercial and transactional queries show less effect, and they may need no adjustment.

## Present the forecast as scenarios

Never present a single number. Present three scenarios, each with its assumptions and its chance of being met or beaten:

| Scenario | Assumptions | Chance of meeting or beating it | Use |
|---|---|---|---|
| Conservative | Trend at 70% of the historical growth rate; one moderate algorithm impact of -8%; no major new competitor | About 85 to 90% | The planning baseline that leadership can safely budget against |
| Base case | Trend at 100% of the historical growth rate; no algorithm impact; normal competition | About 50% | The expected result if conditions stay the same |
| Optimistic | Trend accelerates from planned content; favorable algorithm changes; competitors retreat | About 10 to 15% | The stretch target: possible, but not a planning basis |

The conservative case drives the budget. The base case shows the expected path. The optimistic case sets stretch targets. Use the lower bound of the confidence interval, with the algorithm risk discount, for the conservative line. Use the median for the base case and the upper bound for the optimistic case. With a 75% interval, those choices give the chances in the table.

### Show the uncertainty

A chart with one line suggests false precision. Draw a shaded band between the conservative and optimistic scenarios, and put the three scenario lines inside it. The chart then shows the expected path and the uncertainty around it.

Add vertical notes at known future events. Examples are planned content launches, likely algorithm update windows, and seasonal peaks and dips. The notes connect the forecast to the actions and events that will shape the result.

### Write the assumptions down

Every forecast needs an assumptions table:

| Assumption | Base case value | Sensitivity |
|---|---|---|
| Monthly content production | 8 articles | +/- 20% traffic per article variance |
| Ranking velocity | Historical average | Slows if competition increases |
| Algorithm stability | No major negative update | -10 to -20% if a core update hits |
| Seasonal pattern | Matches prior years | +/- 5% variance from historical |
| Conversion rate | Last 6-month average | Changes with landing page updates |

When the forecast misses, use this table to find the assumption that failed. A miss then becomes a finding, not a loss of credibility. [Forecasts that survive executive scrutiny](/articles/seo-forecasting-executive-scrutiny) covers how to explain the variance to leadership.

### Handle misses

Forecasts miss. Your process for a miss decides whether leadership keeps trusting the next forecast.

When actual traffic falls below the forecast, report the miss at once. Do not wait for the quarterly review. Find the assumption that did not hold. Check the usual causes: an algorithm update, late content production, or a new competitor. Measure the effect of each cause. Then present the adjusted forecast.

When actual traffic beats the forecast, find the cause. It can be one article that met unexpected demand, a competitor's decline, or a favorable update. Decide whether the gain will last before you raise the forecast.

## Validate and improve the model

### Backtest

Hold back the most recent 3 to 6 months of data. Fit the model on the rest. Compare the forecast with the held-back actuals. The backtest error is your best estimate of future accuracy.

Use these MAPE thresholds:

- Under 10% for a stable site.
- Under 15% for a growing site.
- Under 20% for a volatile site.

Above 20%, add features or change the method.

### Set accuracy expectations by horizon

| Horizon | Typical MAPE |
|---|---|
| 3 months, stable site | 8 to 12% |
| 6 months | 12 to 18% |
| 12 months | 20 to 30%, even for a well specified model |

These ranges assume no major algorithm update or competitive shock in the forecast period. Three to six months is the horizon you can forecast with reasonable accuracy. Past six months, the errors compound. For an annual forecast, use wide intervals and scenarios.

A claimed MAPE below 5% means one of two things. The model overfits the history, or the market is unusually stable. Tell stakeholders these ranges before you present your first forecast.

### Track the forecast monthly

Compare the forecast with actual traffic each month and record the variance. If the model always forecasts high or always forecasts low, adjust the trend assumption. If it has no bias but a large variance, add explanatory variables or widen the interval.

### Compare models

Run decomposition, regression, SARIMA, and Prophet in parallel. Track which one gives the lowest MAPE over 6 to 12 months. The best model depends on the site. Seasonal businesses tend to favor SARIMA. Sites with heavy content production tend to favor regression with content variables. Volatile sites tend to favor Prophet with algorithm updates entered as holidays.

## Skills the analyst needs

At minimum, the analyst needs time series decomposition, linear regression, and basic statistical inference, such as confidence intervals and hypothesis tests. Advanced work adds SARIMA, Bayesian inference, and model selection criteria such as AIC and BIC.

Python with `statsmodels`, `pandas`, `numpy`, and `prophet` covers all of these. R with the `forecast` package is an alternative. The concepts matter more than the language. An analyst who understands decomposition can implement it in any language. For the rest of the analyst role in SEO, read [SEO for data analysts](/articles/seo-for-data-analysts).

----

```text
                  .|########||.                                       .|########||.                                       .|########||.
               |##||.      .||##|.                                 |##||.      .||##|.                                 |##||.      .||##|.
             |#|.              .|#|.                             |#|.              .|#|.                             |#|.              .|#|.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
        .#.                          .#|                    .#.                          .#|                    .#.                          .#|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
      |#             ......             #|                |#             ......             #|                |#             ......             #|
     .#           ||#########|           #|              .#           ||#########|           #|              .#           ||#########|           #|
    .#.         |######||######|.        .#.            .#.         |######||######|.        .#.            .#.         |######||######|.        .#.
    #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#
   ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||
   #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #
 ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||
 #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#
 #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.
.|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||
||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||
#.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#
#    .||####|###########################|.     #    #    .||####|###########################|.     #    #    .||####|###########################|.     #
#      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #
#      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #
#      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #
#      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #
#   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #
#. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#
|| |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||
|| ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||
.# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.
 #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#
 ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||
  #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.
   ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||
    #.        .######|#|#########|        .#            #.        .######|#|#########|        .#            #.        .######|#|#########|        .#
    .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.
     |#           ||########||           #.              |#           ||########||           #.              |#           ||########||           #.
      |#             ......             #|                |#             ......             #|                |#             ......             #|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
        |#.                          .#.                    |#.                          .#.                    |#.                          .#.
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
            .|#|.              .|#|.                            .|#|.              .|#|.                            .|#|.              .|#|.
               |##||.      .||##|                                  |##||.      .||##|                                  |##||.      .||##|
                 .||########||.                                      .||########||.                                      .||########||.

Scale With Search  2026  [scalewithsearch.com](https://scalewithsearch.com)
```
