🌐 Gemba-IT Demo Site

Public-facing demo site showing n8n, Excel, FileMaker, and AI integrations to prospective clients.

Last updated: 2026-05-29 (Demo 7 added β€” Email PO PDF β†’ Google Sheets)  Β·  Site: gemba-it.org

Overview

gemba-it.org is a public demo site for prospective IT consulting clients. All demos use fake/sample data and are fully sandboxed from Esquire Embroidery production systems. The core message: "We connect your existing tools β€” Shopify, Excel, FileMaker, Google Sheets β€” so data flows automatically without manual entry."

Infrastructure

ComponentDetails
Domaingemba-it.org β€” registered on Cloudflare (~$10/yr)
HostingExisting EC2, new nginx server block
Web root/var/www/gemba/
nginx config/etc/nginx/conf.d/gemba-it.org.conf
API proxy/api/ β†’ Node.js port 3003
Node.js server/home/ec2-user/gemba-demos/server.js β€” PM2: gemba-demos
SSLCloudflare proxy ON + Let's Encrypt cert
Emailinfo@gemba-it.org β†’ Cloudflare Email Routing β†’ chi.boulding@gmail.com

Accounts

ServiceAccountNotes
Google (all Gemba-IT)chi.boulding@gmail.comSeparate from Esquire's Google account
Shopify PartnersChi BouldingDev store, test mode
OpenAI APIβ€”Key stored in /home/ec2-user/gemba-demos/.env
Cloudflareβ€”DNS + Email Routing + SSL

Google Sheet

FieldValue
NameGemba-IT Demo | Order Tracker
URLOpen Sheet
SharingPublic, view-only (anyone with link)
Tab: Orders (gid=0)Demo 1 — Shopify→Sheets
Tab: Contact Form (gid=1812893464)Demo 2 — Contact Form→Sheets
Tab: Email Demo (gid=376645853)Demo 4 — Email→Sheets
Tab: Excel Upload (gid=2094510383)Demo 5 — Excel→Sheets

Live Demos

1
πŸ›’ Shopify β†’ Google Sheets
β–Ά Live n8n
Fake checkout form
β†’
n8n Webhook
β†’
Google Sheets (Orders tab)
Demo URLgemba-it.org/demos/shopify-to-sheets/ Page file/var/www/gemba/demos/shopify-to-sheets/index.html n8n workflowDEMO β€” Shopify β†’ Google Sheets Webhook pathshopify-demo-order ProductsDemo T-Shirt $29.99 / Demo Hoodie $59.99 / Demo Cap $19.99 Payload fieldsorder_number, created_at, customer_name, email, product, quantity, total
2
πŸ“‹ Contact Form β†’ Google Sheets
β–Ά Live n8n
Contact form
β†’
n8n Webhook
β†’
Google Sheets (Contact Form tab)
Demo URLgemba-it.org/demos/contact-form/ Page file/var/www/gemba/demos/contact-form/index.html n8n workflowDEMO β€” Contact Form β†’ Google Sheets Webhook pathcontact-form-demo Fieldssubmitted_at, name, email, company, message Sheet tab gid1812893464
3
πŸ“Š Excel β†’ AI β†’ PDF
β–Ά Live Node.js + OpenAI
Upload .xlsx
β†’
Node.js parses
β†’
GPT-4o-mini cleans
β†’
pdfkit generates PDF
β†’
Download
Demo URLgemba-it.org/demos/excel-to-pdf/ Page file/var/www/gemba/demos/excel-to-pdf/index.html API endpointPOST /api/upload (multipart, field: file, lang) Sample downloadGET /api/sample Server file/home/ec2-user/gemba-demos/server.js PDF template/home/ec2-user/gemba-demos/templates/product-report.js Font/home/ec2-user/gemba-demos/fonts/NotoSansJP-Regular.otf Languageen / ja / both (bilingual, default: both) AI rulesStandardize names, fill missing qty=0, "out of stock"β†’qty=0, remove $ from prices Safety.xlsx only, 5MB max, rate limit 10/hr/IP, delete after processing
4
βœ‰οΈ Email β†’ Google Sheets
β–Ά Live n8n
Email to info@gemba-it.org
β†’
Gmail trigger (60s poll)
β†’
IF subject contains "DEMO:"
β†’
Google Sheets (Email Demo tab)
Demo URLgemba-it.org/demos/email-to-sheets/ Page file/var/www/gemba/demos/email-to-sheets/index.html n8n workflowDEMO β€” Email β†’ Google Sheets Gmail accountchi.boulding@gmail.com (Gmail API enabled in Google Cloud) Filter ruleSubject contains "DEMO:" (IF node) Sheet fieldsReceived At, From Name, From Email, Subject, Message Sheet tab gid376645853 DelayUp to 60 seconds (polling interval)
5
πŸ“‚ Excel β†’ Google Sheets
β–Ά Live Node.js + n8n
Upload .xlsx
β†’
Node.js parses rows
β†’
n8n webhook
β†’
Split Out
β†’
Google Sheets (Excel Upload tab)
Demo URLgemba-it.org/demos/excel-to-sheets/ Page file/var/www/gemba/demos/excel-to-sheets/index.html API endpointPOST /api/excel-to-sheets (multipart, field: file) Sample downloadGET /api/sample-contacts n8n webhook pathexcel-to-sheets-demo (via localhost:5678) n8n nodesWebhook β†’ Split Out (field: body.rows) β†’ Google Sheets Append Sheet tabExcel Upload (gid=2094510383) Sheet columnsUploaded At, Name, Company, Email, Phone, Notes Sample file/home/ec2-user/gemba-demos/sample-data/sample-contacts.xlsx (6 rows) n8n noteGoogle Sheets node: Value Input Mode = RAW, column values use {{ $json.Name }} (no leading =)
6
πŸ›’ Shopify β†’ Kintone
β–Ά Live Node.js only
Fake Shopify checkout
β†’
Node.js (in-memory store)
β†’
Fake Kintone UI (auto-refresh)
Demo URLgemba-it.org/demos/shopify-to-kintone/ Page file/var/www/gemba/demos/shopify-to-kintone/index.html API endpointsPOST /api/kintone-order  |  GET /api/kintone-records StorageIn-memory array (resets on server restart). Pre-seeded with 3 records (#10001–#10003). LayoutSplit screen: Shopify form (left) | flow animation (center) | Kintone record list (right) Flow animation3-step indicator: Shopify β†’ n8n β†’ Kintone lights up sequentially on submit Kintone UISidebar, topbar (avatar, notifications), record list, clickable row detail panel Order IDsShopify-style: #10001, #10002, … (10000 + sequential id) ProductsDemo T-Shirt $19.99 / Demo Hoodie $49.99 / Demo Cap $14.99 Auto-refreshKintone panel polls every 4 seconds No n8n neededFully self-contained in Node.js β€” no external workflow required
7
πŸ“§ Email PO (PDF) β†’ Google Sheets
β–Ά Live n8n + Node.js
Email with PDF attachment
β†’
n8n Gmail Trigger
β†’
Node.js pdftotext + GPT-4o-mini
β†’
Google Sheets "PO Demo" tab
Demo URLgemba-it.org/demos/email-po-to-sheets/ Page file/var/www/gemba/demos/email-po-to-sheets/index.html Send email toinfo@gemba-it.org with subject starting PO: and PDF attached n8n workflowDEMO β€” Email PO β†’ Google Sheets (saved: demo7-email-po-to-sheets.json) Gmail triggerPolls every 1 min, Download Attachments ON β†’ IF subject contains "PO:" β†’ HTTP Request HTTP Request nodePOST http://localhost:3003/parse-po, multipart form-data, binary field: attachment_0 Server routePOST /parse-po β€” pdftotext extracts text, GPT-4o-mini returns structured JSON PDF extractionSystem tool pdftotext (poppler-utils, installed via yum). Replaces pdf-parse which failed on pdfkit PDFs. GPT outputvendor, po_number, po_date, items (newline-separated), total Google Sheet tabPO Demo (gid=983731624) β€” columns: Received At, Vendor, PO#, PO Date, Items, Total Cell formatRAW (Let n8n Format) β€” items column uses wrap text in Sheet Sample PO/home/ec2-user/gemba-demos/sample-data/sample-purchase-order.pdf (generated by create-sample-po.js) Sample downloadGET /api/sample-po

Planned Demos

TierDemoStatusNotes
2Shopify β†’ Kintone (real)PendingConnect to actual Kintone API when client has account
2Google Sheets β†’ FileMaker SyncPendingEdit Sheet row, FM updates
2Email Classification (AI)PendingAI routes email to correct Sheet tab
3Shopify β†’ FileMaker β†’ Auto EmailPendingFull end-to-end
3Inventory AlertPendingSheet value drops β†’ email notification
3Multi-Step Approval FlowPendingForm β†’ approve by email β†’ FileMaker

Node.js Demo Server

PM2 process gemba-demos runs on port 3003, proxied via nginx at /api/.

FilePurpose
server.jsExpress app β€” all API endpoints for demos 3, 5, 6
templates/product-report.jsPDF generation β€” bilingual layout with Noto Sans JP
fonts/NotoSansJP-Regular.otfJapanese font (16MB, excluded from git)
sample-data/messy-products.xlsxIntentionally messy sample Excel for Demo 3
sample-data/sample-contacts.xlsxSample contacts Excel for Demo 5 (Name, Company, Email, Phone, Notes)
.envOPENAI_API_KEY (excluded from git)
create-sample.jsScript to regenerate messy-products.xlsx
create-contacts-sample.jsScript to regenerate sample-contacts.xlsx

PM2 Commands

CommandAction
pm2 logs gemba-demos --lines 30View recent logs
pm2 restart gemba-demos --update-envRestart and reload .env
pm2 delete gemba-demos && pm2 start server.js --name gemba-demosFull clean restart

Design Notes