form / app.py
SakibAhmed's picture
Upload app.py
fe6b222 verified
from flask import Flask, render_template, request, jsonify
import requests
app = Flask(__name__)
# Configuration - Your n8n webhook URL
N8N_WEBHOOK_URL = "https://n53dnorth.app.n8n.cloud/webhook/lead-intake"
@app.route('/')
def home():
return render_template('index.html')
@app.route('/submit', methods=['POST'])
def submit_form():
"""
Receives form data and forwards it to n8n workflow
Maps form fields to the exact structure expected by n8n
"""
try:
# 1. Get data from the web form
data = request.json
# 2. Prepare payload matching EXACTLY what n8n workflow expects
# Based on the sample: { first_name, last_name, email, city, source, budget }
payload = {
"first_name": data.get('first_name', '').strip(),
"last_name": data.get('last_name', '').strip(),
"email": data.get('email', '').strip(),
"city": data.get('city', '').strip(),
"source": data.get('source', 'Web Form').strip(),
"budget": int(data.get('budget', 5000)), # Convert to integer
# Optional fields (can be included for reference)
"company": data.get('company', '').strip() if data.get('company') else None,
"position": data.get('position', '').strip() if data.get('position') else None,
"phone": data.get('phone', '').strip() if data.get('phone') else None,
"address": data.get('address', '').strip() if data.get('address') else None,
"zip_code": data.get('zip_code', '').strip() if data.get('zip_code') else None,
}
# Remove None values to keep payload clean
payload = {k: v for k, v in payload.items() if v is not None}
print(f"Sending to n8n: {payload}") # Debug log
# 3. Send to n8n webhook
response = requests.post(
N8N_WEBHOOK_URL,
json=payload,
timeout=10 # 10 second timeout
)
print(f"n8n Response Status: {response.status_code}") # Debug log
print(f"n8n Response Body: {response.text}") # Debug log
# 4. Handle n8n's response
if response.status_code == 200:
# Success response from n8n
result = response.json()
return jsonify({
"status": "success",
"message": result.get("message", "Lead submitted successfully!"),
"data": result.get("data"),
"timestamp": result.get("timestamp")
}), 200
elif response.status_code == 400:
# Validation error from n8n
result = response.json()
return jsonify({
"status": "error",
"message": result.get("message", "Validation failed"),
"error": result.get("error")
}), 400
else:
# Unexpected response
return jsonify({
"status": "error",
"message": f"Unexpected response from server (Status: {response.status_code})"
}), 500
except requests.exceptions.Timeout:
return jsonify({
"status": "error",
"message": "Request timed out. Please try again."
}), 504
except requests.exceptions.ConnectionError:
return jsonify({
"status": "error",
"message": "Could not connect to the registration service. Please check your connection."
}), 503
except ValueError as e:
# JSON parsing error
return jsonify({
"status": "error",
"message": f"Invalid data format: {str(e)}"
}), 400
except Exception as e:
# Catch-all for any other errors
print(f"Unexpected error: {str(e)}") # Debug log
return jsonify({
"status": "error",
"message": "An unexpected error occurred. Please try again."
}), 500
@app.route('/health', methods=['GET'])
def health_check():
"""Health check endpoint"""
return jsonify({"status": "healthy", "service": "Lead Registration API"}), 200
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=7860)