Note: do not enter tax IDs, bank details, or other sensitive payment information here. Those are collected separately through a secure channel.
+
+
+
Experiment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Venture & Contact
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Problem & Scope
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How your information is used
@@ -585,14 +720,23 @@ const BASE = "https://autonomy.digitalchances.co.ke/webhook";
const ENDPOINTS = {
client: BASE + "/client-onboarding",
intern: BASE + "/intern-onboarding",
- contractor: BASE + "/contractor-onboarding"
+ contractor: BASE + "/contractor-onboarding",
+ experiment: BASE + "/experiment-onboarding",
+ mvp: BASE + "/mvp-onboarding"
+};
+// Discord channels the n8n workflows open threads in; sent with each submission.
+const DISCORD_CHANNELS = {
+ experiment: "1511998970216448031", // #experiment-products
+ mvp: "1534550504401670194" // #mvps-pre-onboarding
};
const SHARED_SECRET = ""; // set to match the workflows' SECRET
const ROLE_META = {
client: { tag:"Client", title:"Client engagement", required:["name","contactEmail","projectName","projectGoal","owner"], nameLabel:"Company name" },
intern: { tag:"Intern", title:"Intern placement", required:["name","focusArea","mentor","owner"], nameLabel:"Full name" },
- contractor: { tag:"Contractor", title:"Contractor engagement", required:["name","specialty","scope","owner"], nameLabel:"Full name" }
+ contractor: { tag:"Contractor", title:"Contractor engagement", required:["name","specialty","scope","owner"], nameLabel:"Full name" },
+ experiment: { tag:"Experiment", title:"Experiment product", required:["name","productName","hypothesis","owner"], nameLabel:"Lead / team name" },
+ mvp: { tag:"MVP", title:"MVP pre-onboarding", required:["name","contactEmail","productName","problem","owner"], nameLabel:"Founder / company name" }
};
const INTERN_HANDBOOK = `# Digital Chances - Intern Handbook
@@ -670,6 +814,7 @@ function gotoStep(n){
function collect(){
const data = { type: currentRole, submittedAt: new Date().toISOString() };
+ if(DISCORD_CHANNELS[currentRole]) data.discordChannelId = DISCORD_CHANNELS[currentRole];
form.querySelectorAll("[data-shared]").forEach(i=>{ if(i.name) data[i.name]=i.value.trim(); });
const active = document.querySelector(`.role-fields[data-fields="${currentRole}"]`);
active.querySelectorAll("input,select,textarea").forEach(i=>{ if(i.name) data[i.name]=i.value.trim(); });
@@ -706,7 +851,7 @@ form.addEventListener("submit",(e)=>{
function buildReview(data){
const rows = el("reviewRows"); rows.innerHTML = "";
- const skip = new Set(["type","submittedAt"]);
+ const skip = new Set(["type","submittedAt","discordChannelId"]);
Object.keys(data).forEach(k=>{
if(skip.has(k) || !data[k]) return;
const row = document.createElement("div"); row.className="rev-row";
@@ -750,11 +895,14 @@ el("submitBtn").addEventListener("click", async ()=>{
function showConfirm(ref){
el("refNumber").textContent = ref;
const m = ROLE_META[currentRole];
- el("confirmTitle").textContent = `${m.tag} engagement started`;
+ el("confirmTitle").textContent = { experiment:"Experiment registered", mvp:"MVP pre-onboarding received" }[currentRole]
+ || `${m.tag} engagement started`;
const steps = {
client: ["An internal owner has been assigned to your engagement.","A project space is being set up.","Expect a first response within 1–2 business days."],
intern: ["Your placement record has been created.","Your mentor will be notified.","Download your documents below and read them before day one."],
- contractor: ["Your engagement record has been created.","Contract and deliverables are being reviewed.","Expect next steps from your point of contact shortly."]
+ contractor: ["Your engagement record has been created.","Contract and deliverables are being reviewed.","Expect next steps from your point of contact shortly."],
+ experiment: ["Your experiment record has been created.","A thread is being opened in #experiment-products.","Post progress there and judge it against your kill criteria on the decision date."],
+ mvp: ["Your MVP record has been created.","A thread is being opened in #mvps-pre-onboarding.","An owner will review scope and reach out to schedule a kickoff."]
}[currentRole];
el("confirmMsg").textContent = "Your submission has been received and routed to the right owner at Digital Chances.";
el("nextSteps").innerHTML = steps.map(s=>`