diff --git a/EbayListingTool/Views/NewListingView.xaml b/EbayListingTool/Views/NewListingView.xaml
index a221973..e12f2a5 100644
--- a/EbayListingTool/Views/NewListingView.xaml
+++ b/EbayListingTool/Views/NewListingView.xaml
@@ -435,16 +435,21 @@
-
+
@@ -457,7 +462,7 @@
-
diff --git a/EbayListingTool/Views/NewListingView.xaml.cs b/EbayListingTool/Views/NewListingView.xaml.cs
index 7e88e4e..1cb985f 100644
--- a/EbayListingTool/Views/NewListingView.xaml.cs
+++ b/EbayListingTool/Views/NewListingView.xaml.cs
@@ -428,6 +428,39 @@ public partial class NewListingView : UserControl
finally { SetPriceBusy(false); }
}
+ private void PriceBox_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
+ => UpdateFeeEstimate();
+
+ private void PostageBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ => UpdateFeeEstimate();
+
+ private static readonly Dictionary PostageEstimates = new()
+ {
+ ["RoyalMailFirstClass"] = 3.70m,
+ ["RoyalMailSecondClass"] = 2.85m,
+ ["RoyalMailTracked24"] = 4.35m,
+ ["RoyalMailTracked48"] = 3.60m,
+ ["CollectionOnly"] = 0m,
+ ["FreePostage"] = 0m,
+ };
+
+ private void UpdateFeeEstimate()
+ {
+ if (BFeeLabel == null) return;
+ var price = (decimal)(BPriceBox?.Value ?? 0);
+ if (price <= 0) { BFeeLabel.Visibility = Visibility.Collapsed; return; }
+
+ var postageTag = (BPostageBox?.SelectedItem as ComboBoxItem)?.Tag?.ToString() ?? "";
+ PostageEstimates.TryGetValue(postageTag, out var postageEst);
+
+ const decimal fvfRate = 0.128m;
+ const decimal minFee = 0.30m;
+ var fee = Math.Max(Math.Round((price + postageEst) * fvfRate, 2), minFee);
+
+ var postageNote = postageEst > 0 ? $" + est. \u00A3{postageEst:F2} postage" : "";
+ BFeeLabel.Text = $"Est. eBay fee: \u00A3{fee:F2} (12.8% of \u00A3{price:F2}{postageNote})";
+ BFeeLabel.Visibility = Visibility.Visible;
+ }
private void SetPriceBusy(bool busy)
{
AiPriceBtn.IsEnabled = !busy;