Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Automate daily construction report generation using n8n workflow automation.
.claude/skills/datadrivenconstruction-n8n-daily-report/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 29% | 0% |
Daily reports are critical but time-consuming. This n8n workflow automates collection of site data from multiple sources and generates formatted daily reports.
[Site Data Sources] → [n8n Webhook] → [Data Processing] → [Report Generation] → [Distribution]json{ "nodes": [ { "name": "Daily Schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": { "interval": [{"field": "cronExpression", "expression": "0 17 * * 1-5"}] } } }, { "name": "Webhook Input", "type": "n8n-nodes-base.webhook", "parameters": { "httpMethod": "POST", "path": "daily-report-data" } } ] }
json{ "nodes": [ { "name": "Get Weather Data", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.openweathermap.org/data/2.5/weather", "qs": { "lat": "={{$json.site_lat}}", "lon": "={{$json.site_lon}}", "appid": "={{$env.WEATHER_API_KEY}}" } } }, { "name": "Get Site Photos", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "={{$env.PROCORE_API}}/projects/{{$json.project_id}}/images", "authentication": "oAuth2" } }, { "name": "Get Labor Data", "type": "n8n-nodes-base.spreadsheetFile", "parameters": { "operation": "read", "fileFormat": "xlsx" } } ] }
json{ "name": "Process Report Data", "type": "n8n-nodes-base.code", "parameters": { "jsCode": "const items = $input.all();\n\nconst weather = items[0].json;\nconst photos = items[1].json;\nconst labor = items[2].json;\n\nconst report = {\n date: new Date().toISOString().split('T')[0],\n project: $('Webhook Input').first().json.project_name,\n weather: {\n condition: weather.weather[0].main,\n temp_high: Math.round(weather.main.temp_max - 273.15),\n temp_low: Math.round(weather.main.temp_min - 273.15)\n },\n labor_summary: {\n total_workers: labor.reduce((sum, l) => sum + l.workers, 0),\n total_hours: labor.reduce((sum, l) => sum + l.hours, 0)\n },\n photo_count: photos.length\n};\n\nreturn [{json: report}];" } }
json{ "name": "Generate PDF Report", "type": "n8n-nodes-base.httpRequest", "parameters": { "method": "POST", "url": "={{$env.PDF_SERVICE_URL}}/generate", "body": { "template": "daily_report", "data": "={{$json}}" } } }
json{ "nodes": [ { "name": "Send Email", "type": "n8n-nodes-base.emailSend", "parameters": { "toEmail": "={{$json.distribution_list}}", "subject": "Daily Report - {{$json.project}} - {{$json.date}}", "attachments": "={{$node['Generate PDF Report'].json.file}}" } }, { "name": "Upload to SharePoint", "type": "n8n-nodes-base.microsoftSharePoint", "parameters": { "operation": "upload", "siteId": "={{$env.SHAREPOINT_SITE}}", "folderId": "/Daily Reports/{{$json.date}}" } } ] }
pythonimport requests from datetime import date def trigger_daily_report(project_data: dict, webhook_url: str): """Trigger n8n daily report workflow.""" payload = { "project_id": project_data['id'], "project_name": project_data['name'], "site_lat": project_data['latitude'], "site_lon": project_data['longitude'], "distribution_list": project_data['stakeholder_emails'] } response = requests.post(webhook_url, json=payload) return response.status_code == 200 def format_labor_data(labor_entries: list) -> list: """Format labor data for n8n processing.""" formatted = [] for entry in labor_entries: formatted.append({ 'trade': entry['trade'], 'company': entry['company'], 'workers': entry['worker_count'], 'hours': entry['total_hours'], 'activities': entry.get('activities', []) }) return formatted
WEATHER_API_KEYPROCORE_APIPDF_SERVICE_URLSHAREPOINT_SITE| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 19,244 | 14,661 | -24% | 1 | 1 | 0% | 3,521 | 4,442 | +26% | 0 | 0 | — |
case-02 | fail→fail | 13,064 | 15,147 | +16% | 1 | 1 | 0% | 2,836 | 4,844 | +71% | 0 | 0 | — |
case-03 | fail→fail | 15,028 | 12,826 | -15% | 1 | 1 | 0% | 3,008 | 4,316 | +43% | 0 | 0 | — |
case-04 | fail→pass | 6,993 | 2,109 | -70% | 1 | 1 | 0% | 1,120 | 1,810 | +62% | 0 | 0 | — |
case-05 | fail→fail | 10,854 | 10,047 | -7% | 1 | 1 | 0% | 2,061 | 3,614 | +75% | 0 | 0 | — |
case-06 | fail→pass | 8,898 | 4,571 | -49% | 1 | 1 | 0% | 1,769 | 2,305 | +30% | 0 | 0 | — |
case-07 | fail→pass | 10,425 | 2,185 | -79% | 1 | 1 | 0% | 1,850 | 1,851 | +0% | 0 | 0 | — |
case-08 | fail→fail | 12,741 | 12,474 | -2% | 1 | 1 | 0% | 2,222 | 3,900 | +76% | 0 | 0 | — |
case-09 | fail→fail | 9,326 | 11,499 | +23% | 1 | 1 | 0% | 1,542 | 3,521 | +128% | 0 | 0 | — |
case-10 | fail→fail | 9,791 | 2,345 | -76% | 1 | 1 | 0% | 1,614 | 1,906 | +18% | 0 | 0 | — |
case-11 | pass→pass | 5,933 | 3,427 | -42% | 1 | 1 | 0% | 1,070 | 2,095 | +96% | 0 | 0 | — |
case-12 | pass→pass | 7,468 | 2,470 | -67% | 1 | 1 | 0% | 1,301 | 1,949 | +50% | 0 | 0 | — |
case-13 | fail→fail | 10,592 | 2,065 | -81% | 1 | 1 | 0% | 1,923 | 1,831 | -5% | 0 | 0 | — |
case-14 | fail→pass | 11,372 | 6,036 | -47% | 1 | 1 | 0% | 2,078 | 2,678 | +29% | 0 | 0 | — |
case-15 | fail→pass | 11,808 | 3,422 | -71% | 1 | 1 | 0% | 2,303 | 2,159 | -6% | 0 | 0 | — |
case-16 | fail→pass | 13,664 | 3,430 | -75% | 1 | 1 | 0% | 2,411 | 2,117 | -12% | 0 | 0 | — |
case-17 | fail→pass | 8,509 | 7,461 | -12% | 1 | 1 | 0% | 1,456 | 2,834 | +95% | 0 | 0 | — |
case-18 | fail→pass | 7,301 | 3,708 | -49% | 1 | 1 | 0% | 1,306 | 2,198 | +68% | 0 | 0 | — |
case-19 | pass→pass | 9,927 | 4,466 | -55% | 1 | 1 | 0% | 1,909 | 2,338 | +22% | 0 | 0 | — |
case-20 | pass→pass | 15,349 | 16,026 | +4% | 1 | 1 | 0% | 2,919 | 4,548 | +56% | 0 | 0 | — |
case-21 | pass→pass | 15,510 | 16,432 | +6% | 1 | 1 | 0% | 3,358 | 5,077 | +51% | 0 | 0 | — |
case-22 | pass→pass | 10,100 | 9,943 | -2% | 1 | 1 | 0% | 2,027 | 3,585 | +77% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.