Fixes from June to October
A batch of correctness fixes across spaces, Sell, worksheets, attachments, and invites:
- Duplicated spaces keep their setup: each app instance is copied with its own name and settings, and module prerequisite locks and ordering carry over.
- One-time offer coupons: the coupon is applied before checkout, so the platform fee is calculated on the discounted price.
- Coupon redemption caps: the cap sits on the promotion code, so a forever discount keeps applying on later invoices after the code hits its redemption limit.
- Checkout errors are visible: a failed checkout shows an error instead of leaving the Join button doing nothing.
- Long worksheet answers are readable in the response overview.
- PDF attachments: downloads no longer send PDFs through the image optimizer, so a PDF opens instead of failing like a missing file.
- Invites: blank email rows are ignored, and a validation error is shown when an address is still invalid.