Upload files
Drop .sav, .por, or .zsav file here or click to browse
Reporting Ticket (.docx)
Questionnaire (.docx/.pdf)
Reporting Ticket parsed successfully
AILabel Enrichment
One-click analysis
AI auto-detects banners, nets, and MRS groups. Add a Reporting Ticket and Questionnaire above to enrich labels, detect skip logic, and match question specs.
Running auto-analysis...
Select stubs (rows in your crosstab)
Stubs are the questions that appear as rows in your tables. Each stub generates one crosstab sheet (or one block in single-sheet mode).
MRS = "select all that apply" questions (binary yes/no per option, e.g., brand awareness). Group the individual binary variables into one table where percentages can exceed 100%.
Hold Ctrl/Cmd to select multiple. Tip: filter by prefix (e.g. "AWARE" or "Q5")
Grid = rating scale questions with the same scale (e.g., 7 satisfaction questions all on 1-5). Shows Top 2 Box %, Bottom 2 Box %, and Mean in one compact summary sheet.
Select variables that share the same scale (e.g., all 1-5 satisfaction questions)
Options
Top 2 Box / Bottom 2 Box (T2B/B2B) and Means auto-apply to scale variables (4-11 point scales). Significance letters (A, B, C...) show which columns are statistically different.
Single sheet is ideal for scrolling, copy-paste to PPT, or comparing questions side by side.
Custom Groups (optional)
Define custom banner columns by combining conditions. Example: "London + Uber users" = region is London AND aware of Uber. Each group becomes a column with significance testing.
Current configuration
Processing...
Check that your .sav file is valid and not corrupted. If the problem persists, try with fewer stubs or a smaller file. API docs
API Reference — curl / Python / Node
curl — multiple banners + means + MRS
curl -X POST https://spss.insightgenius.io/v1/tabulate \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@survey.sav" \
-F 'spec={
"banners": ["gender", "region", "age_group"],
"stubs": ["_all_"],
"significance_level": 0.95,
"include_means": true,
"nets": {"sat_overall": {"Top 2 Box": [4,5], "Bottom 2 Box": [1,2]}},
"mrs_groups": {"Brand_Awareness": ["AWARE_A","AWARE_B","AWARE_C"]}
}' -o tabulation.xlsx
Python
import requests, json
resp = requests.post(
"https://spss.insightgenius.io/v1/tabulate",
headers={"Authorization": "Bearer YOUR_API_KEY"},
files={"file": open("survey.sav", "rb")},
data={"spec": json.dumps({
"banners": ["gender", "region"],
"stubs": ["_all_"],
"include_means": True,
"significance_level": 0.95,
})}
)
with open("tabulation.xlsx", "wb") as f:
f.write(resp.content)
print(f"{resp.headers['X-Stubs-Success']} tables generated")
Node.js
const fs = require("fs");
const FormData = require("form-data");
const form = new FormData();
form.append("file", fs.createReadStream("survey.sav"));
form.append("spec", JSON.stringify({
banners: ["gender", "region"],
stubs: ["_all_"],
include_means: true,
significance_level: 0.95,
}));
const resp = await fetch("https://spss.insightgenius.io/v1/tabulate", {
method: "POST",
headers: { Authorization: "Bearer YOUR_API_KEY", ...form.getHeaders() },
body: form,
});
fs.writeFileSync("tabulation.xlsx", Buffer.from(await resp.arrayBuffer()));
console.log(`${resp.headers.get("X-Stubs-Success")} tables generated`);