From the Tools shelf · No. 0010
Preventivo Gatti
A plumber in Brescia wants to write the quote on his phone at the customer's door and send the PDF on WhatsApp.
Worked example (simulated interview)
The brief
This is a worked example. Askmill wrote this prompt from a simulated client interview, in which a model answered the questions for an invented client. The line under the title is the opening request the interview started from; everything else came out of the answers.
The prompt
The complete text, exactly as it is handed to an AI builder.
A quote pad on one plumber's ageing Android phone: Sandro Gatti, idraulico e termotecnico in Brescia, stands in a customer's boiler room, taps his usual items, hands the phone over for a finger signature and sends an A4 PDF on WhatsApp before he is back in the van. Concept: the quote is finished where the job is seen, never at the kitchen table in the evening. Real mechanics, in integer cents, rounded half-up: amount = quantity × net price; Imponibile = sum of amounts; IVA = Imponibile × 22% (default) or 10%, switched by hand on each quote and never chosen by the tool; Totale = Imponibile + IVA. Optional round-down to a typed lower target T: Imponibile = round(T ÷ (1 + rate)), IVA = T − Imponibile, and a line "Arrotondamento" shows the difference from the sum of amounts. Worked check: amounts 1.830,00 € give IVA 402,60 € and Totale 2.232,60 €; rounded down to 2.200,00 € they give Arrotondamento −26,72 €, Imponibile 1.803,28 €, IVA 396,72 €. Data: the price list ("Listino") starts with five entries (name, unit, net price, step): "Diritto di chiamata", a corpo, 40,00, 1; "Manodopera", ora, 38,00, 0,5; "Tubo multistrato", m, 4,50, 1; "Raccordo", pz, 6,50, 1; "Smaltimento vecchia caldaia", a corpo, 60,00, 1. The first two have "Sempre nel nuovo preventivo" switched on, so every new quote opens with 1 call-out and 1 hour already in. A "Voce libera" row takes a typed description, quantity and price ("Caldaia a condensazione 26 kW", a boiler at an example price, 1 × 1.480,00). Each quote keeps its own snapshot, so editing the Listino never changes an old quote. Numbers run YYYY/NNN, given when the sheet is first opened, restarting at 001 each January; "Prossimo numero" is editable. There are three sending states, "In corso", "Da inviare", "Inviato", plus a separate mark "Accettato il <data>" once signed. Sent quotes are read-only except for signing; "Copia" makes a new quote with a new number, today's date and current Listino prices. Mood: orderly, plain, dependable; a white form on a clipboard under the tube light of a boiler room. Light page, because it is read in cellars, in sun on the pavement and on paper. Palette: sheet white #FFFFFF (the quote and every card); workbench grey #F1F2F4 (ground behind cards); ink #111111 (all text, at least 16:1 on both grounds); slate #555B66 (units and dates, at least 6:1); rule grey #C9CDD3 (hairlines only); overalls blue #1F3A6E (about 11:1 on white), used only for section titles and the Totale figure on the sheet and for the one primary button on each screen, nothing else; signal amber #F2B233 with ink text (about 10:1), used only for the label "Da inviare". No red: errors are ink text beside a drawn warning triangle. The only tint is ink at 6% for a pressed row. The sheet must read correctly printed in black and white. Structure: five screens. 1) "Preventivi": a full-width 64 px button "Nuovo preventivo"; any quote "In corso" as "Riprendi"; the group "Da inviare" with its count ("2 da inviare") and a 56 px ink-outlined "Invia" on each row; the latest 30 quotes with "Mostra altri 30"; the field "Cerca per nome". 2) "Preventivo", the editor: CLIENTE ("Nome", "Indirizzo del lavoro", "Telefono"; the switch "Azienda o condominio" reveals "Partita IVA"); VOCI (each row shows description and quantity × price = amount, with minus, plus and "Togli"); "Aggiungi voce", which opens the Listino as a bottom sheet of 64 px rows ending with "Voce libera"; the switch "IVA 22% / IVA 10%" with the line "L'aliquota la scegli tu."; "Arrotonda il totale"; "Pagamento a fine lavori" (editable); "Note"; a sticky bar with the live Totale and "Vedi il foglio". 3) "Foglio": the A4 sheet exactly as the PDF, with "Fai firmare", "Invia su WhatsApp", "Salva, invio dopo", "Modifica", "Copia". 4) "Listino". 5) "I miei dati": header details, the logo picked once from the phone's pictures (a drawn round mark with the initials SG stands in until then), the message line, "Copia di sicurezza" and "Ripristina". A bar of three tabs (Preventivi, Listino, I miei dati) is hidden inside the editor and the sheet. Typography and voice: system sans only (system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif); nothing on screen below 16 px; body 18 px/1.4; row names 20 px weight 600; amounts 22 px tabular; Totale 32 px weight 700; section labels 16 px capitals, letter-spacing 0.08em. The sheet copies a tidy office form: logo top left; top right "Sandro Gatti", "Idraulico e termotecnico", "<via>, Brescia", "P.IVA 01234560987", "C.F. <codice fiscale>", "Tel. 333 555 0142" (sample values, replaced in I miei dati); "PREVENTIVO N. <anno>/014", "Brescia, <data>"; blue capitals "CLIENTE", "LAVORI E MATERIALI", "CONDIZIONI"; then "Preventivo valido 30 giorni.", "Pagamento a fine lavori.", notes and "Firma del cliente per accettazione" over a rule. Italian formats everywhere (1.830,00 €, GG/MM/AAAA). Voice: short, spoken, polite, like Sandro at the door. Exact lines: empty search "Nessun preventivo con questo nome."; no signal "Qui non c'è segnale. Lo mandi quando esci."; round-down error "Solo per difetto: scrivi una cifra più bassa di 2.232,60 €." (with the current Totale); missing name "Manca il nome del cliente."; PDF failure "Non riesco a creare il foglio. Il preventivo è salvato: riprova."; default message "Buongiorno, le invio il preventivo in allegato. È valido 30 giorni. Sandro Gatti". Entrance: at 0 s the title and "Nuovo preventivo" are already painted from static markup; by 300 ms the rows arrive (40 ms stagger, 160 ms, 8 px rise, ease-out); by 1 s everything is usable. The first run is never empty: one finished six-line quote labelled "Esempio" (Marta Bonomi, Via Trieste 18, Brescia, Totale 2.232,60 €) sits in the list, removable with "Elimina esempio", above the hint "Chiamata e manodopera ci sono già." Interaction: tapping a Listino row adds it and closes the sheet; minus and plus are 48 × 48 px with 8 px between them, rows at least 56 px; tapping a quantity opens the numeric keypad; "Togli" replaces the row for 5 s with "Voce tolta. Annulla". Every change is saved within 300 ms and again when the page is hidden, so after a phone call the editor reopens on the same quote at the same place. "Fai firmare" shows only the number, the Totale and a 220 px pad with a baseline, plus "Cancella firma" and "Conferma firma"; an unsigned quote can be reopened and signed later under the same number. From 900 px wide the editor is a 440 px column beside the live sheet; on a phone the screens stack. Keyboard: Tab in visual order, Enter or Space activates, Escape closes or goes back, ArrowUp/ArrowDown step a focused quantity, N starts a quote from Preventivi; focus ring 3 px ink. Signature moment: the send. 0–120 ms "Invia su WhatsApp" sinks; 120–520 ms the sheet shrinks to 28% (cubic-bezier(.2,.8,.2,1)) while "Preventivo-<anno>-014-Bonomi.pdf" is built; then the phone's share panel opens with the file and the message, which is also copied ("Messaggio copiato"). On return the small sheet drops into the top of the list over 300 ms, its label turns from "Da inviare" to "Inviato", and a chip gives the time since "Nuovo preventivo" was tapped: "Fatto in 4 min 20 s" (omitted beyond 60 minutes). With no connection the primary button is "Salva, invio dopo" and the quote waits in "Da inviare". Any tap skips the motion. Hidden detail: a long press on the Totale writes the sum out the long way, "40,00 + 171,00 + 1.480,00 + 27,00 + 52,00 + 60,00 = 1.830,00". No sound of any kind. Reduced motion: no stagger, no shrinking sheet; labels simply change. Performance: no libraries; index.html under 150 KB; usable within 1 s on a 2017 phone; a 20-line PDF in under 800 ms; logo stored once as a JPEG at most 600 px wide; a signature capped at 2,000 points; nothing running when idle. Persistence: IndexedDB, schema version 1, holding quotes, Listino, details, logo, message, counter and last backup date. "Copia di sicurezza" shares one file, "copia-gatti-<data>.json", with all of it; "Ripristina" reads it after the confirmation "Sostituire tutto con la copia del <data>?"; when the last copy is older than 30 days Preventivi shows "Ultima copia di sicurezza: 34 giorni fa." Fallback without file sharing: the PDF is downloaded, the message copied, and the row asks "L'hai mandato?" with "Sì, inviato" and "Non ancora". Until I miei dati has been saved once, sending answers "Prima controlla i tuoi dati." Never: adverts, sign-up, password, tracking, network requests, or any panel that opens by itself over the editor. Deliver a fully self-contained index.html plus a short sw.js that caches it so the tool opens with no signal. Done when: 1) a six-line quote, from "Nuovo preventivo" to the share panel, takes under 5 minutes with one thumb; 2) the worked check matches to the cent, at 22% and with the round-down; 3) in airplane mode a quote is built, signed and saved, then sent later with one tap on "Invia"; 4) leaving the page mid-quote and returning loses nothing; 5) typing "bono" finds Marta Bonomi's quote. DESCRIPTION On a scratched phone held in one hand, a grey screen opens with a single wide blue button, "Nuovo preventivo", and beneath it a short list of white cards: two carry an amber label, "Da inviare", because they were written in a cellar with no signal. A tap on the button and the quote already holds the call-out and one hour of labour; a thumb adds six metres of pipe and eight fittings from the Listino with large plus and minus keys, types the boiler model on a free line, and the Totale in the bar at the bottom changes with every tap. "Vedi il foglio" shows the result as the customer will get it: a white A4 sheet with black lettering on thin rules, Sandro Gatti's logo at the top left, small blue capitals over each part and one blue figure, the total. The customer signs with a finger on the line. The sheet shrinks, the share panel opens on WhatsApp with a polite line already written, and back in the list the card reads "Inviato", "Accettato il <data>" and "Fatto in 4 min 20 s". VISUAL TECHNIQUES - Money held in integer cents with half-up rounding; one pure function returns amounts, Imponibile, Arrotondamento, IVA and Totale and is the only source for editor, sheet and PDF - Hand-written PDF 1.4 writer, no library: A4 at 595 × 842 pt, 48 pt margins, built-in Helvetica and Helvetica-Bold with WinAnsi encoding (accents and € included), 0.5 pt vector rules - Sheet layout table: logo box max 120 × 60 pt; name 14 pt bold; body 10.5 pt; section capitals 9 pt in #1F3A6E; columns Descrizione, Q.tà, U.m., Prezzo, Importo; right-aligned totals with "TOTALE" 16 pt bold; signature rule 200 pt; beyond 18 lines a second page with repeated column heads and "Pagina 2 di 2" - On-screen sheet drawn in HTML from the same layout table and scaled to the screen width, so preview and PDF cannot differ - Logo intake through a file input: flattened on white, downscaled to 600 px wide, stored as JPEG at quality 0.85 and embedded in the PDF as a DCT stream - Signature pad on pointer events: 2.5 px strokes smoothed with quadratic curves, points normalised to the pad, capped at 2,000, written into the PDF as vector paths - IndexedDB schema version 1 with per-quote snapshots of lines, prices, IVA rate, target total, signature and states; persistent storage requested at first save - Autosave with a 300 ms debounce plus a flush on visibilitychange and pagehide; open quote and position restored at launch - Cache-first service worker (sw.js) holding index.html, so the tool starts with no connection - Sending through navigator.share with a File after a canShare test; fallback to download plus clipboard and a manual "Sì, inviato" confirmation - Accent-insensitive search (NFD normalisation, marks stripped) over customer name and job address, filtering as typed - Backup as one JSON file with a version field, logo and signatures inside as text; restore validates the version and shows the backup date before overwriting - Fixed Italian formatter (dot for thousands, comma for decimals, dd/mm/yyyy) independent of the device language - Send choreography with the Web Animations API: scale to 28% and a FLIP landing in the list, removed under reduced motion INTERACTION MODEL On Preventivi, tapping "Nuovo preventivo" (or pressing N) opens the editor with call-out and one hour of labour already in; "Riprendi" reopens a quote "In corso"; "Invia" on a "Da inviare" row opens the share panel directly; typing in "Cerca per nome" filters the list; tapping any card opens its sheet. In the editor, "Aggiungi voce" raises the Listino, a tap on a row adds it and lowers the sheet, "Voce libera" adds an empty row to type; minus and plus change a quantity by its step (0,5 hours, 1 metre, 1 piece), a tap on the number opens the numeric keypad, ArrowUp and ArrowDown do the same on a focused quantity; "Togli" removes a row and offers "Annulla" for 5 s. The IVA switch changes between 22% and 10%; "Arrotonda il totale" accepts only a lower figure; a long press on the Totale writes out the sum line by line. "Vedi il foglio" assigns the number and shows the sheet. There, "Fai firmare" opens the pad, "Cancella firma" empties it, "Conferma firma" places the signature and marks the quote "Accettato"; "Invia su WhatsApp" builds the PDF and opens the share panel, "Salva, invio dopo" files the quote under "Da inviare"; "Modifica" returns to the editor until the quote is sent; "Copia" starts a new quote from this one. Listino rows edit name, unit, price, step and "Sempre nel nuovo preventivo". I miei dati edits header details, logo, message line and "Prossimo numero", and holds "Copia di sicurezza" and "Ripristina". Tab follows visual order with a 3 px ink focus ring, Enter or Space activates, Escape closes the Listino or goes back one screen. With reduced motion nothing slides or shrinks; states change in place.
What's inside this prompt
The sections of this prompt, in order, with their length.
- Overview 170 words
- Data 164 words
- Mood 149 words
- Structure 210 words
- Typography and voice 196 words
- Entrance 237 words
- Signature moment 393 words
- Description 187 words
- Visual techniques 359 words
- Interaction model 285 words
More prompts from the library
Turnos Sant Elm
Our small vet clinic in Valencia needs help building a fair monthly rota with nights and Sundays on call.
Worked example (simulated interview)
Hearthbook
An app where my partner and I write down what we spend on the house, so we can see each month whether the money will last.
Example by Askmill
Falegnameria Valgrande
A family joinery near Verona wants a site that shows its kitchens and stairs and lets people book the free measuring visit.
Worked example (simulated interview)
Write yours
This prompt was written for someone else's idea. Askmill interviews you about yours, one plain question at a time, then writes the prompt your AI builder needs: $4.00 for a public prompt, $8.00 for a private one.