from flask import Flask, render_template, request, jsonify import logging app = Flask(__name__, static_folder='static', template_folder='templates') # Setup logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/api/simulate', methods=['POST']) def simulate(): try: data = request.get_json(silent=True) if not data: return jsonify({'error': 'Invalid JSON data or empty body'}), 400 traffic = float(data.get('traffic', 10000)) cpc = float(data.get('cpc', 1.5)) product_price = float(data.get('product_price', 99)) steps = data.get('steps', []) if not steps or not isinstance(steps, list): return jsonify({'error': 'No steps provided or invalid format'}), 400 # Calculate funnel flow current_users = traffic total_spend = traffic * cpc results = [] # Add Initial Step (Traffic Source) results.append({ 'step_name': 'Traffic Source', 'users': int(current_users), 'conversion_rate': 100, 'dropoff': 0 }) for step in steps: name = step.get('name', 'Unknown Step') rate = float(step.get('rate', 50)) / 100.0 # Convert percentage to decimal next_users = current_users * rate dropoff = current_users - next_users results.append({ 'step_name': name, 'users': int(next_users), 'conversion_rate': step.get('rate', 50), 'dropoff': int(dropoff) }) current_users = next_users final_users = current_users total_revenue = final_users * product_price roi = ((total_revenue - total_spend) / total_spend) * 100 if total_spend > 0 else 0 cac = total_spend / final_users if final_users > 0 else 0 response = { 'metrics': { 'total_spend': round(total_spend, 2), 'total_revenue': round(total_revenue, 2), 'roi': round(roi, 2), 'cac': round(cac, 2), 'final_conversions': int(final_users) }, 'funnel_data': results } return jsonify(response) except Exception as e: logger.error(f"Error in simulation: {e}") return jsonify({'error': str(e)}), 500 @app.route('/health') def health(): return jsonify({'status': 'healthy'}), 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=7860, debug=True)