Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -116,37 +116,44 @@ class SeoAppUI:
|
|
| 116 |
def _display_info_expander(self):
|
| 117 |
with st.expander("βΉοΈ How the app works [CLICK TO EXPAND]", expanded=False):
|
| 118 |
st.markdown(
|
| 119 |
-
|
| 120 |
<div style="background-color: #f0f2f6; padding: 20px; border-radius: 10px;">
|
| 121 |
-
<p>
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
<p>
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
<p>
|
| 128 |
-
<
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
<p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
<ul>
|
| 134 |
-
<li><b>
|
| 135 |
-
<li><b>
|
| 136 |
</ul>
|
| 137 |
-
<p>The
|
| 138 |
-
|
| 139 |
-
<p>
|
| 140 |
<ul>
|
| 141 |
-
<li><b>Target SERP Position
|
| 142 |
-
<li><b>High-Impact
|
| 143 |
</ul>
|
| 144 |
</div>
|
| 145 |
""",
|
| 146 |
-
|
| 147 |
-
)
|
| 148 |
)
|
| 149 |
|
|
|
|
| 150 |
def _get_sidebar_inputs(self):
|
| 151 |
with st.sidebar:
|
| 152 |
st.header("π§ Assumptions & Inputs")
|
|
|
|
| 116 |
def _display_info_expander(self):
|
| 117 |
with st.expander("βΉοΈ How the app works [CLICK TO EXPAND]", expanded=False):
|
| 118 |
st.markdown(
|
| 119 |
+
"""
|
| 120 |
<div style="background-color: #f0f2f6; padding: 20px; border-radius: 10px;">
|
| 121 |
+
<p><b>1. Load Your GSC Data</b><br>
|
| 122 |
+
If no file is uploaded, a sample is used. All column names are lowercased. If no <code>cpc</code> column is found, CPC values are simulated between 0.50β3.00 USD.</p>
|
| 123 |
+
|
| 124 |
+
<p><b>2. CTR Benchmarks by Position</b><br>
|
| 125 |
+
Expected click-through rates (CTR) are mapped for positions 1β20 to estimate traffic uplift.</p>
|
| 126 |
+
|
| 127 |
+
<p><b>3. Incremental Clicks</b><br>
|
| 128 |
+
<code>Incremental Clicks = Projected - Current</code><br>
|
| 129 |
+
β’ Current = Impressions Γ Current CTR<br>
|
| 130 |
+
β’ Projected = Impressions Γ Target CTR</p>
|
| 131 |
+
|
| 132 |
+
<p><b>4. Financial Impact</b><br>
|
| 133 |
+
β’ <b>Avoided Paid Spend</b> = Incremental Clicks Γ CPC (value of organic traffic replacing paid ads)<br>
|
| 134 |
+
β’ <b>Net Savings</b> = Avoided Spend β SEO Investment<br>
|
| 135 |
+
β’ <b>Incremental MRR</b> = Customers Γ MRR per Customer<br>
|
| 136 |
+
β’ <b>SEO ROI</b> = (Incremental MRR β SEO Investment) Γ· SEO Investment</p>
|
| 137 |
+
|
| 138 |
+
<p><b>5. Understanding βAd Spendβ</b><br>
|
| 139 |
+
This is a <b>user-defined hypothetical amount</b> used only for comparison. It is not derived from CPC or added to SEO cost. The app compares:</p>
|
| 140 |
<ul>
|
| 141 |
+
<li><b>SEO's incremental MRR</b> from your defined SEO investment</li>
|
| 142 |
+
<li><b>Against a fixed ad spend</b> (e.g. what you might spend on paid campaigns)</li>
|
| 143 |
</ul>
|
| 144 |
+
<p>The βAd Spendβ box turns <span style="color: green; font-weight: bold;">green</span> when SEO outperforms ads, or <span style="color: red; font-weight: bold;">red</span> otherwise.</p>
|
| 145 |
+
|
| 146 |
+
<p><b>6. Interpreting Results</b></p>
|
| 147 |
<ul>
|
| 148 |
+
<li><b>Target SERP Position</b>: Acts as a uniform benchmark applied to all queries to project improvement.</li>
|
| 149 |
+
<li><b>Focus on High-Impact Keywords</b>: In the results table, look for βπ Improvementβ rows with high impressions and incremental clicks β these are your SEO sweet spots.</li>
|
| 150 |
</ul>
|
| 151 |
</div>
|
| 152 |
""",
|
| 153 |
+
unsafe_allow_html=True,
|
|
|
|
| 154 |
)
|
| 155 |
|
| 156 |
+
|
| 157 |
def _get_sidebar_inputs(self):
|
| 158 |
with st.sidebar:
|
| 159 |
st.header("π§ Assumptions & Inputs")
|