Public-facing demo site showing n8n, Excel, FileMaker, and AI integrations to prospective clients.
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."
| Component | Details |
|---|---|
| Domain | gemba-it.org β registered on Cloudflare (~$10/yr) |
| Hosting | Existing 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 |
| SSL | Cloudflare proxy ON + Let's Encrypt cert |
info@gemba-it.org β Cloudflare Email Routing β chi.boulding@gmail.com |
| Service | Account | Notes |
|---|---|---|
| Google (all Gemba-IT) | chi.boulding@gmail.com | Separate from Esquire's Google account |
| Shopify Partners | Chi Boulding | Dev store, test mode |
| OpenAI API | β | Key stored in /home/ec2-user/gemba-demos/.env |
| Cloudflare | β | DNS + Email Routing + SSL |
| Field | Value |
|---|---|
| Name | Gemba-IT Demo | Order Tracker |
| URL | Open Sheet |
| Sharing | Public, 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 |
/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
/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
/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
/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)
/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 =)
/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
/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
| Tier | Demo | Status | Notes |
|---|---|---|---|
| 2 | Shopify β Kintone (real) | Pending | Connect to actual Kintone API when client has account |
| 2 | Google Sheets β FileMaker Sync | Pending | Edit Sheet row, FM updates |
| 2 | Email Classification (AI) | Pending | AI routes email to correct Sheet tab |
| 3 | Shopify β FileMaker β Auto Email | Pending | Full end-to-end |
| 3 | Inventory Alert | Pending | Sheet value drops β email notification |
| 3 | Multi-Step Approval Flow | Pending | Form β approve by email β FileMaker |
PM2 process gemba-demos runs on port 3003, proxied via nginx at /api/.
| File | Purpose |
|---|---|
server.js | Express app β all API endpoints for demos 3, 5, 6 |
templates/product-report.js | PDF generation β bilingual layout with Noto Sans JP |
fonts/NotoSansJP-Regular.otf | Japanese font (16MB, excluded from git) |
sample-data/messy-products.xlsx | Intentionally messy sample Excel for Demo 3 |
sample-data/sample-contacts.xlsx | Sample contacts Excel for Demo 5 (Name, Company, Email, Phone, Notes) |
.env | OPENAI_API_KEY (excluded from git) |
create-sample.js | Script to regenerate messy-products.xlsx |
create-contacts-sample.js | Script to regenerate sample-contacts.xlsx |
| Command | Action |
|---|---|
pm2 logs gemba-demos --lines 30 | View recent logs |
pm2 restart gemba-demos --update-env | Restart and reload .env |
pm2 delete gemba-demos && pm2 start server.js --name gemba-demos | Full clean restart |
.ja β font-size: 12px; color: #aaa; display: block;/demos/ on every demo page/var/www/gemba/demos/index.html/var/www/gemba/index.html β LINE button + demo button + info@gemba-it.org