Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -116,14 +116,35 @@ 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 |
-
|
| 122 |
-
|
| 123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
</div>
|
| 125 |
""",
|
| 126 |
-
|
|
|
|
| 127 |
)
|
| 128 |
|
| 129 |
def _get_sidebar_inputs(self):
|
|
|
|
| 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>1. <b>Load your GSC data</b> (we lowercase all column names on load). If no file is uploaded, we use the default sample data. If no <code>cpc</code> column is present, we simulate values between 0.50 and 3.00 USD.</p>
|
| 122 |
+
<p>2. <b>CTR benchmarks</b> by position map an expected click-through rate for positions 1–20.</p>
|
| 123 |
+
<p>3. <b>Incremental Clicks</b> = Projected_Clicks – Current_Clicks</p>
|
| 124 |
+
<p> • Current_Clicks = Impressions × Current_CTR</p>
|
| 125 |
+
<p> • Projected_Clicks = Impressions × Target_CTR</p>
|
| 126 |
+
<p>4. <b>Financials</b></p>
|
| 127 |
+
<p> • <b>Avoided Paid Spend</b> = Incremental_Clicks × CPC. This represents the money you <b>don't</b> have to spend on paid ads because your organic SEO efforts are now bringing in those clicks and conversions.</p>
|
| 128 |
+
<p> • <b>Net Savings vs Paid</b> = Avoided Paid Spend – SEO Investment</p>
|
| 129 |
+
<p> • <b>Incremental MRR</b> = Customers × MRR_per_Customer</p>
|
| 130 |
+
<p> • <b>SEO ROI</b> = (Incremental MRR – SEO Investment) ÷ SEO Investment</p>
|
| 131 |
+
<p><b>Understanding "Additional Ad Spend"</b></p>
|
| 132 |
+
<p>The "Additional Ad Spend" input in the sidebar is a <b>hypothetical budget figure you provide for comparison</b>. It's <b>not</b> calculated from your GSC data or CPC. Instead, it allows you to:</p>
|
| 133 |
+
<ul>
|
| 134 |
+
<li><b>Compare SEO's revenue generation directly against a specific paid ad budget.</b> For instance, if you're considering spending an extra X dollars on Google Ads, you can see whether your SEO's projected incremental MRR is higher or lower than that same amount.</li>
|
| 135 |
+
<li><b>Visualize the efficiency of your SEO investment.</b> If your SEO investment generates significantly more incremental MRR than a comparable additional ad spend, it highlights SEO as a potentially more effective use of marketing funds.</li>
|
| 136 |
+
</ul>
|
| 137 |
+
<p>The "Ad Spend" metric will be <span style="color: green; font-weight: bold;">green</span> if your projected Incremental MRR from SEO is <b>greater than</b> this additional ad spend, and <span style="color: red; font-weight: bold;">red</span> if it is not.</p>
|
| 138 |
+
|
| 139 |
+
<p>5. <b>Interpreting Results & Assumptions</b></p>
|
| 140 |
+
<ul>
|
| 141 |
+
<li><b>Target SERP Position:</b> The 'Target SERP Position' is an <u>aspirational average</u> you aim for among your <u>most important and achievable keywords</u>, rather than a literal expectation for every single query. In reality, not all keywords will reach the same position due to varying competition and relevance.</li>
|
| 142 |
+
<li><b>High-Impact Queries:</b> While the model calculates for all queries, focus your analysis on the 'Detailed Keyword Performance' table. Look for queries with a '🚀 Improvement' impact category and high 'impressions' and 'incremental_clicks'. These are often your most promising opportunities for SEO effort.</li>
|
| 143 |
+
</ul>
|
| 144 |
</div>
|
| 145 |
""",
|
| 146 |
+
unsafe_allow_html=True,
|
| 147 |
+
)
|
| 148 |
)
|
| 149 |
|
| 150 |
def _get_sidebar_inputs(self):
|