Quote Generator
Business quotes as Word and PDF – plus a ready email draft.
Turns a few key facts into a complete business quote, identical in .docx and PDF, with reference number, validity, payment terms and a neutral business tone – then files both documents as a ready-to-send email draft.
- Version
- 1.0.0
- Updated
- Length
- 9 chapters · approx. 5 min read
- Format
- SKILL.md (Markdown, German)
- License
- CC BY-NC-ND 4.0
When this skill kicks in
Business quotes as Word and PDF – plus a ready email draft.
What's inside
- 01Zweck
- 02Workflow
- 03Checkliste (vor dem Erstellen klären, falls nicht bekannt)
- 04Standardwerte (nicht nachfragen, ausser der Nutzer widerspricht)
- 05Struktur der Offerte (immer diese Reihenfolge, in Word und PDF identisch)
- 06Dateien in diesem Skill
- 07Technische Hinweise: Word
- 08Technische Hinweise: PDF
- 09E-Mail-Entwurf mit Anhängen (Outlook / Microsoft 365)
Full instructions
The complete file content, identical to the download. Written in German.
Offerte-Generator
Zweck
Aus wenigen Eckdaten eine vollständige Geschäftsofferte erzeugen, in Word und PDF identisch aufgebaut, und als E-Mail-Entwurf versandbereit ablegen. Neutrale, klare Business-Korrespondenz, keine Marketingsprache und keine feste Markenstimme. Der Skill ist bewusst allgemein gehalten: er passt für Vorträge, Workshops, Beratungsmandate, Implementierungsprojekte oder jede andere Dienstleistung, unabhängig von Branche oder Firma.
Workflow
- Angaben sammeln. Checkliste unten durchgehen. Fehlt etwas Entscheidungsrelevantes (Empfänger, Leistung, Preis), kurz nachfragen statt zu raten. Für alles andere gelten die Standardwerte weiter unten, ohne Rückfrage.
- Daten strukturieren. Als JSON nach dem Schema in
assets/schema_beispiel.jsonablegen, z.B. unter/tmp/offerte_data.json. - Beide Dateien erzeugen:
- PDF:
python3 scripts/generate_pdf.py <data.json> <output.pdf> - Word:
node scripts/generate_docx.js <data.json> <output.docx>
- PDF:
- Kontrolle. Bei Layoutzweifeln PDF als Bild rendern (
pdftoppm -jpeg -r 100 output.pdf page) und ansehen, bevor die Datei rausgeht. Angaben gegen die Checkliste abgleichen. - E-Mail-Entwurf anlegen. Über Zapier den passenden Microsoft-Mail-Connector nutzen (Outlook oder Office 365, siehe Abschnitt unten), beide Dateien als Anhang. Betreff: "Offerte: [Titel]". Begleittext kurz halten (2-3 Sätze), Inhalt der Offerte nicht in der Mail wiederholen.
- Nie automatisch versenden. Der Entwurf ist das Ergebnis. Nur wenn der Nutzer im selben Auftrag ausdrücklich sagt, dass sofort verschickt werden soll ("schick das direkt ab", "sende es jetzt"), den Entwurf danach tatsächlich versenden.
Checkliste (vor dem Erstellen klären, falls nicht bekannt)
| Feld | Herkunft |
|---|---|
| Absender: Name, Firma, Adresse, evtl. E-Mail/Telefon | vom Nutzer, immer erfragen, nie annehmen |
| Empfänger: Firma, Ansprechperson, Adresse | vom Nutzer |
| Leistungsbeschrieb: Art, Umfang, Dauer, Ort/Format | vom Nutzer |
| Preis pro Position + Total | vom Nutzer |
| Referenznummer + Datum | selbst generieren: OFF-JJJJ-NN, laufende Nummer falls bekannt, sonst grob geschätzt |
| Gültigkeit | Standard: 30 Tage ab Ausstellungsdatum |
| Zahlungskonditionen | Standard unten, ausser Nutzer gibt andere vor |
| Bezug/Kontext (Gespräch, Anfrage, Datum) | vom Nutzer, für den Einleitungssatz |
Standardwerte (nicht nachfragen, ausser der Nutzer widerspricht)
- Zahlungskonditionen: "Zahlbar netto 30 Tage nach Rechnungsstellung. Preise verstehen sich exkl. gesetzlicher MWSt."
- Gültigkeit: "Dieses Angebot ist gültig bis zum oben genannten Datum."
- Ton: neutrale, klare Business-Sprache, kurze bis mittellange Sätze, keine Füllwörter, kein Marketing-Ton.
- Typografie: gerade Anführungszeichen ("" statt «»), keine Halbgeviertstriche, ä/ö/ü direkt schreiben, ss statt ß, Tausendertrennzeichen mit Apostroph (7'600.00).
- Zahlenformat: Preise immer mit zwei Nachkommastellen, Währung vor dem Betrag (CHF 7'600.00).
Absender-Daten nie aus früheren Läufen übernehmen oder erfinden. Jede Offerte braucht ihre eigenen, vom Nutzer bestätigten Angaben.
Struktur der Offerte (immer diese Reihenfolge, in Word und PDF identisch)
- Briefkopf: Absender links, Offerte-Nr./Datum/Gültigkeit rechts, Trennlinie darunter
- Empfänger-Adresse
- Betreffzeile (fett)
- Anrede
- Einleitungssatz: Bezug auf Anfrage oder Gespräch, ein bis zwei Sätze, kein Marketing
- Leistungstabelle: Position, Beschreibung, Menge, Einzelpreis, Total
- Summenblock: Zwischentotal, Total (fett), MWSt-Hinweis
- Zahlungs- und Gültigkeitsbedingungen
- Abschlusssatz, Grussformel, Unterschrift
Neue Positionen in line_items erweitern die Tabelle automatisch; das Schema ist nicht auf eine feste Anzahl Zeilen festgelegt.
Dateien in diesem Skill
| Datei | Zweck |
|---|---|
assets/offerte_template.html.j2 | HTML/CSS-Vorlage (A4, WeasyPrint-tauglich, Jinja2-Platzhalter) |
assets/schema_beispiel.json | Beispiel-Datensatz, zeigt das erwartete JSON-Schema vollständig |
scripts/generate_pdf.py | füllt die HTML-Vorlage mit den Daten und rendert sie zu PDF |
scripts/generate_docx.js | baut dasselbe Dokument nativ in Word, gleiche Struktur und Zahlen |
Technische Hinweise: Word
docx (npm) ist im Environment vorinstalliert, kein npm install nötig. Tabellenspalten brauchen sowohl columnWidths auf der Tabelle als auch width auf jeder Zelle (beide WidthType.DXA), sonst bricht die Darstellung in Google Docs. Zellschattierung nur mit ShadingType.CLEAR, nie SOLID. Nach dem Erzeugen zur Kontrolle rendern:
python3 /mnt/skills/public/docx/scripts/office/soffice.py --headless --convert-to pdf output.docx
pdftoppm -jpeg -r 100 output.pdf page
Technische Hinweise: PDF
WeasyPrint und Jinja2 werden vom Skript bei Bedarf automatisch installiert (ensure_dependencies() in generate_pdf.py), da das Sandbox-Environment zwischen Sessions zurückgesetzt wird. Bei manueller Prüfung:
python3 -c "import weasyprint" || pip install weasyprint --break-system-packages
CSS bewusst auf WeasyPrint-Kompatibilität gehalten: @page-Regel mit @bottom-right für die Seitenzahl, kein inset-Shorthand für kritische Positionierung, normaler Dokumentfluss statt absoluter Positionierung (anders als im ebook-html-pdf-Skill, das ist dort nötig wegen fixer Seiten, hier nicht).
E-Mail-Entwurf mit Anhängen (Outlook / Microsoft 365)
Es gibt keinen dedizierten Outlook-Connector in diesem Environment, der Versand läuft über den generischen Zapier-Connector. Zapier führt zwei getrennte Microsoft-Mail-Apps mit unterschiedlichen selected_api-Werten:
| App in Zapier | selected_api | Für |
|---|---|---|
| Microsoft Outlook | MicrosoftOutlookCLIAPI | Persönliches Outlook/Outlook.com-Postfach |
| Microsoft Office 365 | MicrosoftOffice365CLIAPI | Geschäftliches M365-Postfach (Business/Enterprise, kein Outlook.com) |
Bei Unklarheit kurz fragen, welches der beiden zutrifft, statt zu raten. Die beiden Apps haben unterschiedliche Actions und Parameter.
Vorgehen bei jedem Lauf (Action-Namen und Parameter nie auswendig annehmen, immer live nachschlagen):
- Prüfen, ob die passende App schon aktiv ist:
Zapier:inspect_zapier_actionsmitselected_apider gewählten App. - Falls nicht aktiv:
Zapier:discover_zapier_actionsmit dem App-Namen, dannZapier:enable_zapier_actionmit dem gefundenenselected_api. Das liefert bei Bedarf auch den Autorisierungslink für den Nutzer. - Mit
Zapier:inspect_zapier_actions(gefiltert auf die Draft-/Compose-Action, z.B. Suche nach "draft" oder "compose" im Aktionsnamen) das exakte Parameterschema holen, inkl. wie Anhänge übergeben werden (Feldname, Format, ob Base64 oder URL erwartet wird). - PDF und Word als Anhang vorbereiten, Format gemäss Schema aus Schritt 3 (typischerweise Base64):
import base64 pdf_content = base64.b64encode(open("output.pdf", "rb").read()).decode() docx_content = base64.b64encode(open("output.docx", "rb").read()).decode() Zapier:execute_zapier_write_actionmit der in Schritt 3 gefundenenaction,selected_apiund den passenden Parametern: Empfänger, Betreff ("Offerte: [Titel]"), kurzer Begleittext (2-3 Sätze, Inhalt der Offerte nicht wiederholen), beide Anhänge.
Wenn die gewählte App bzw. der Nutzer-Account mehrere Verbindungen hat (Zapier:list_zapier_connections), im Zweifel nachfragen statt die erste zu nehmen.
Der Entwurf landet im Postfach des Nutzers und ist bereit zum Absenden. Kein automatischer Versand, siehe Workflow-Schritt 6. Falls die verfügbare Action keinen reinen "Entwurf"-Modus kennt, sondern nur direktes Senden: das dem Nutzer explizit sagen und vor dem Versand bestätigen lassen, statt ungefragt zu senden.
Zuletzt aktualisiert: 02.09.2026 · Version 1.0.0 · skills.fragroger.ai
Lizenz: CC BY-NC-ND 4.0 (Namensnennung – nicht kommerziell – keine Bearbeitungen). Nutzung nur für den Eigengebrauch. https://creativecommons.org/licenses/by-nc-nd/4.0/deed.de
Step by step: download, upload, adapt
No installation, no folders, no terminal. Download the file, upload it to the chat tool of your choice and adapt it with a prompt.
Click “SKILL.md” above. You get a single markdown file. A full bundle with templates is available too.
Skills are plain text – adapt tone, language, audience and output format for your own use. The licence does not allow republishing modified versions. FAQ on adaptation, personal use and republishing
License and use
This skill is published under Creative Commons BY-NC-ND 4.0 – attribution, non-commercial, no derivatives. It is meant for personal use only: download it, use it in your own working environment, share it with attribution. Resale, redistribution as your own product, commercial exploitation or republishing modified versions are not permitted. Please get in touch for commercial licenses.