Quotes & invoices

Create quotes, send them to customers in their local currency, convert accepted quotes to invoices, and record payments.

The Sales admin under /dashboard/admin/sales lets you run the done-for-you side of the business end-to-end. Customers can submit quote requests from the DFY package pages; you turn those into formal quotes, send them via email with a hosted quote URL, accept them online with legal-grade audit trail, and convert accepted quotes into invoices with one click.

Quote requests (inbound)

When a visitor hits “Request a tailored quote” on a DFY package page or the AI consulting landing, their submission lands in Sales → Quote requests. We auto-detect their country (via Cloudflare geo-IP) and suggest the right currency for the response.

For each request you can: Quote (creates a client record and starts a new quote in their inferred local currency), Reply (opens their email), or Dismiss.

Creating a quote

1
Go to Sales → Quotes → New quote.
2
Pick a client (or create one first from the Clients tab). The client's default currency pre-fills the quote.
3
Add line items (description, quantity, unit price, optional tax %, optional discount %).
4
Optionally: paste a sales-call transcript into the AI draft tab and let Claude Sonnet 4.6 populate the title, scope, terms, and pricing for you. Always review before sending.
5
Save draft, then click Send to email the customer.

Hosted quote URL

Every quote has a unique unguessable public URL like www.modkrib.com/q/<token>. Customers don't need to log in. They scroll, review, and accept right in the browser. Every view is logged with IP, country, and timestamp (visible on the quote detail page Timeline).

Customer accepts

The customer types their full name as a digital signature, ticks the agreement checkbox, and clicks Accept. The acceptance is recorded with:

  • IP address + Cloudflare-inferred country
  • User agent
  • Typed signature name
  • Timestamp (UTC)
  • Specific version of the quote that was accepted
  • HMAC-chained event hash (tamper-evident)

This is sufficient for ESIGN/UETA compliance for B2B engagements under ~$100k. For higher-value contracts, route through DocuSign separately.

Convert to invoice

On an accepted quote, click Convert to invoice. We:

  • Create the invoice with all line items copied
  • Default the due date to 14 days from today
  • Link back to the source quote (auditable)

Sending an invoice

Click Send on the invoice detail page. By default this also auto-mints a Stripe Payment Link — your customer can pay by card right from the hosted invoice page. Stripe sends you a webhook when paid; we mark the invoice as paid and record a payment row automatically.

Tip: If you don't want Stripe (e.g. for bank-transfer-only invoices), uncheck the “Auto-mint Stripe Payment Link” option in the Send dialog.

Recording manual payments

For bank transfers, checks, cash, or anything paid outside Stripe, use the Record payment button on the invoice detail page. Capture:

  • Method (bank transfer, check, cash, wire, PayPal, Stripe-external, other)
  • Amount in the invoice's currency
  • Reference (e.g. bank transaction ID, check number)
  • Reconciliation note (free-text)
  • Paid-at timestamp

The invoice status updates automatically: partial → paid when total received ≥ total due. The customer receives a payment receipt email automatically.

Heads up: Audit trail is append-only. Payments cannot be deleted once recorded — if you make a mistake, record a corrective negative entry (use method “other”) with an explanation.