Advertisement
Guest User

Adjusted tROAS calculator

a guest
Sep 19th, 2024
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.22 KB | None | 0 0
  1. import React, { useState } from 'react';
  2.  
  3. const ROASCalculator = () => {
  4. const [regularPrice, setRegularPrice] = useState(100);
  5. const [margin, setMargin] = useState(50);
  6. const [currentTargetROAS, setCurrentTargetROAS] = useState(200);
  7. const [aggressivenessFactor, setAggressivenessFactor] = useState(0);
  8. const [discounts, setDiscounts] = useState([10, 20, 30]);
  9.  
  10. // Additional costs state
  11. const [netShippingCost, setNetShippingCost] = useState(5);
  12. const [averageTransactionFees, setAverageTransactionFees] = useState(2);
  13. const [averageFulfillmentCosts, setAverageFulfillmentCosts] = useState(3);
  14.  
  15. const calculateResults = (discount) => {
  16. const discountedPrice = regularPrice * (1 - discount / 100);
  17.  
  18. // Calculate additional costs as a percentage of the regular price
  19. const additionalCostsPercentage = (netShippingCost + averageFulfillmentCosts) / regularPrice * 100 + averageTransactionFees;
  20.  
  21. // Calculate ROAS metrics
  22. const oldBreakEvenROAS = 100 / (margin - additionalCostsPercentage) * 100;
  23. const newBreakEvenROAS = oldBreakEvenROAS / (1 - discount / 100);
  24.  
  25. // Calculate adjusted Target ROAS based on aggressiveness factor
  26. const normalAdjustedTargetROAS = currentTargetROAS / (1 - discount / 100);
  27. const aggressiveAdjustment = (normalAdjustedTargetROAS - newBreakEvenROAS) * (aggressivenessFactor / 100);
  28. const adjustedTargetROAS = normalAdjustedTargetROAS - aggressiveAdjustment;
  29.  
  30. return {
  31. discountedPrice: discountedPrice.toFixed(2),
  32. oldBreakEvenROAS: oldBreakEvenROAS.toFixed(2),
  33. newBreakEvenROAS: newBreakEvenROAS.toFixed(2),
  34. adjustedTargetROAS: adjustedTargetROAS.toFixed(2),
  35. };
  36. };
  37.  
  38. const addDiscount = () => {
  39. setDiscounts([...discounts, 0]);
  40. };
  41.  
  42. const updateDiscount = (index, value) => {
  43. const newDiscounts = [...discounts];
  44. newDiscounts[index] = Number(value);
  45. setDiscounts(newDiscounts);
  46. };
  47.  
  48. return (
  49. <div className="p-4 max-w-4xl mx-auto">
  50. <h1 className="text-2xl font-bold mb-4">Compact ROAS Calculator for Black Friday Discounts</h1>
  51.  
  52. <div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-4 gap-4 mb-4">
  53. <div>
  54. <label className="block mb-1">Regular Price (€)</label>
  55. <input
  56. type="number"
  57. value={regularPrice}
  58. onChange={(e) => setRegularPrice(Number(e.target.value))}
  59. className="w-full p-2 border rounded"
  60. />
  61. </div>
  62. <div>
  63. <label className="block mb-1">Margin (%)</label>
  64. <input
  65. type="number"
  66. value={margin}
  67. onChange={(e) => setMargin(Number(e.target.value))}
  68. className="w-full p-2 border rounded"
  69. />
  70. </div>
  71. <div>
  72. <label className="block mb-1">Current Target ROAS (%)</label>
  73. <input
  74. type="number"
  75. value={currentTargetROAS}
  76. onChange={(e) => setCurrentTargetROAS(Number(e.target.value))}
  77. className="w-full p-2 border rounded"
  78. />
  79. </div>
  80. <div>
  81. <label className="block mb-1">Aggressiveness Factor (%)</label>
  82. <input
  83. type="number"
  84. value={aggressivenessFactor}
  85. onChange={(e) => setAggressivenessFactor(Number(e.target.value))}
  86. className="w-full p-2 border rounded"
  87. />
  88. </div>
  89. </div>
  90.  
  91. <h2 className="text-xl font-bold mb-2">Additional Costs</h2>
  92. <div className="grid grid-cols-3 gap-4 mb-4">
  93. <div>
  94. <label className="block mb-1">Net Shipping Cost (€)</label>
  95. <input
  96. type="number"
  97. value={netShippingCost}
  98. onChange={(e) => setNetShippingCost(Number(e.target.value))}
  99. className="w-full p-2 border rounded"
  100. />
  101. </div>
  102. <div>
  103. <label className="block mb-1">Avg Transaction Fees (%)</label>
  104. <input
  105. type="number"
  106. value={averageTransactionFees}
  107. onChange={(e) => setAverageTransactionFees(Number(e.target.value))}
  108. className="w-full p-2 border rounded"
  109. />
  110. </div>
  111. <div>
  112. <label className="block mb-1">Avg Fulfillment Costs (€)</label>
  113. <input
  114. type="number"
  115. value={averageFulfillmentCosts}
  116. onChange={(e) => setAverageFulfillmentCosts(Number(e.target.value))}
  117. className="w-full p-2 border rounded"
  118. />
  119. </div>
  120. </div>
  121.  
  122. <button onClick={addDiscount} className="bg-blue-500 text-white px-4 py-2 rounded mb-4">
  123. Add Discount Scenario
  124. </button>
  125.  
  126. <div className="overflow-x-auto">
  127. <table className="w-full border-collapse border">
  128. <thead>
  129. <tr className="bg-gray-100">
  130. <th className="border p-2">Discount (%)</th>
  131. <th className="border p-2">Discounted Price (€)</th>
  132. <th className="border p-2">Old Break-Even ROAS (%)</th>
  133. <th className="border p-2">New Break-Even ROAS (%)</th>
  134. <th className="border p-2">Adjusted Target ROAS (%)</th>
  135. </tr>
  136. </thead>
  137. <tbody>
  138. {discounts.map((discount, index) => {
  139. const results = calculateResults(discount);
  140. return (
  141. <tr key={index}>
  142. <td className="border p-2">
  143. <input
  144. type="number"
  145. value={discount}
  146. onChange={(e) => updateDiscount(index, e.target.value)}
  147. className="w-20 p-1 border rounded"
  148. />
  149. </td>
  150. <td className="border p-2">{results.discountedPrice}</td>
  151. <td className="border p-2">{results.oldBreakEvenROAS}</td>
  152. <td className="border p-2">{results.newBreakEvenROAS}</td>
  153. <td className="border p-2">{results.adjustedTargetROAS}</td>
  154. </tr>
  155. );
  156. })}
  157. </tbody>
  158. </table>
  159. </div>
  160. </div>
  161. );
  162. };
  163.  
  164. export default ROASCalculator;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement