New: watch a billing event arrive nine times and count once. Open the Engine Room →
Free for 10 bottles a month

Write it now.
It arrives later.

Bottle holds a message or a webhook and delivers it at the time you set. Once, not twice, and not never.

No card needed. Open source on GitHub

New bottle

To: ada@example.com

Happy birthday, Ada. I wrote this in October so I would not forget in March.

Arrives 14 March, 09:00
  1. Stored
  2. Waiting
  3. Delivered once

A reminder waits in an app until you open it. A bottle comes to you.

Write a message to a person: a birthday note, a nudge, a letter to yourself next year. Or write a webhook to a server: end a trial in 14 days, lift a deploy freeze on Friday.

Then close the tab. Bottle delivers it at the time you set, once.

  1. Step 1

    Write it

    Write a message to a person, or a request to a server.

  2. Step 2

    Set the time

    Choose a minute, a day or a year from now.

  3. Step 3

    Forget it

    Bottle stores it and sends it at that time, once.

Delivery

Built so nothing
arrives twice

Networks drop requests, servers restart, and senders retry. Bottle is built for those cases first, so the normal case is easy.

Stored before it is confirmed

Bottle writes your bottle to the database first and answers second. If you got an answer, the bottle is safe.

Copies are dropped

Send the same request twice with one idempotency key. You get one bottle and you pay for one.

Your count cannot go below zero

Two requests that reach the server at the same moment cannot both take your last bottle.

Retries keep the same id

If a send fails, Bottle tries again after 30 seconds, 2 minutes, 10 minutes, 1 hour and 4 hours. Each try carries the same id.

  1. Try 2 after 30 s
  2. Try 3 after 2 min
  3. Try 4 after 10 min
  4. Try 5 after 1 h
  5. Try 6 after 4 h

Open source

Read the code, run it yourself, and check every claim on this page.

Billing events get the same care

Plan changes and payments from Kinde pass through the same intake. A payment that arrives five times counts once.

Engine Room

See it work, live

Run the storm. A test account gets one plan change and one payment, sent nine times, in the wrong order, with a failure in the middle. Then read what the account looks like at the end.

acceptedcustomer.payment_succeeded
duplicatecustomer.payment_succeeded
duplicatecustomer.payment_succeeded
acceptedcustomer.plan_changed
acceptedcustomer.agreement_cancelled

Pricing

Start free. Move to Pro when you send more.

Free

$0

  • 10 bottles a month
  • Messages and webhooks
  • Retries and delivery log
  • API access

Pro

$9 a month

  • 500 bottles a month
  • Everything in Free
  • Billing handled by Kinde
  • Cancel at any time

Questions

What is a bottle?

A bottle is a message or a webhook with a delivery time. You write it now. Bottle keeps it and sends it at the time you set.

What does "once" mean here?

Bottle stores every bottle before it confirms it, sends it when it is due, and records the result. If a send fails, Bottle tries again with the same id, so the receiver can tell a second copy from a new bottle.

Can I cancel a bottle?

Yes. You can cancel a bottle until it goes out. You get the bottle back in your monthly count.

Who can read my bottles?

Your bottles are stored in the Bottle database so they can be sent later. Only your account can list them. The Engine Room shows event types and counts, never message text.

Where does Kinde fit?

Kinde handles sign-in and billing. When you change plan or a payment goes through, Kinde sends an event. Bottle stores that event with the same care it gives your bottles, so a repeated event cannot change your plan twice.

Is Bottle open source?

Yes. The code is on GitHub under the MIT licence. You can read it, run it, and change it.

Say it now. Let it arrive on time.

Your first 10 bottles each month are free.