Dawnlet · under the hood

Purchases & gating

Dawnlet Plus is one subscription with a monthly and a yearly plan. The interesting part isn't the transaction — it's where the gate is enforced, and why it's enforced twice.

One subscription group $3.99/mo or $34.99/yr No server-side tier Gate enforced twice

§One subscription, two plans

An auto-renewable subscription, handled entirely by StoreKit. Two products — $3.99 a month and $34.99 a year — sit in a single App Store subscription group, so switching between them is an upgrade or a downgrade rather than a second purchase. Yearly is group level 1 and monthly level 2: moving up to yearly takes effect immediately with proration, and moving down to monthly is deferred to the end of the year you already paid for. The 14-day free trial is an introductory offer on the group, so it's granted once no matter which plan you start on.

There is no server-side record of your subscription — no tier column on your account, nothing in the database that knows you paid, no receipt posted to a server of ours and no App Store Server Notifications endpoint. The entitlement lives with Apple, tied to your Apple ID, and the app reads it on the device with StoreKit 2's Transaction.currentEntitlements. Restoring on a new device re-checks with Apple.

The one thing a subscription genuinely added is a second listener. Transactions cover purchases and renewals, but a cancellation or a billing grace period produces no transaction at all, so the service also watches the subscription's status stream and re-resolves the entitlement from it.

A prediction this page got wrong

Dawnlet's database has no idea whether you're a paying customer, so a bug in it can't revoke access, and the purchase record isn't another piece of personal data to hold. This page used to add that subscriptions "would be a real architectural change rather than a pricing decision — which is a feature, not an oversight." That turned out to be exactly backwards, in an instructive way. Because the entitlement was always read from StoreKit on the device and never mirrored into the database, moving from a one-time purchase to subscriptions touched the purchase layer and the paywall and nothing else. The property being defended — no server-side tier — is precisely what made the move cheap, and it survived it intact.

A single purchase service instance is created once and made available to the whole app, so any screen can check the entitlement without it being threaded through every initialiser.

1Four shapes of gate

ShapeUsed byBehaviour
Whole featureReports and export; Apple Contacts sync A lock screen with the live price replaces the content entirely. The row that leads there stays visible, so the feature can be discovered without paying to find out it exists.
Free-tier capEvery module (500 items each) One number for all eleven modules, set far above honest daily use. It used to be six different caps — ten habits, ten todos, five tracked activities — all of which fired while someone was still deciding whether Dawnlet was for them.
Per itemNotification kinds; the "Repeats" control; budgets A locked item is a dimmed row or a small card with a lock glyph, sitting in a screen whose other half works.
Retrieval onlyMonth insights, journal "on this day" Logging and reading back are free and uncapped; the layer that interprets them is not.

All four shapes answer to one rule: the present is free, looking back is Plus. Capture anything, in any module, uncapped, and read back every day and month you ever recorded. What Plus buys is the layer that only exists because you kept using the app — month insights, reports over any range, export — plus the automation that repeats things for you.

Two whole-feature gates came off. The money tab used to be one, for a reason spelled out on its own page: money has no unit to cap that is both meaningful and not hostile. The reasoning was right and the conclusion was still wrong — it meant the most-built module in the app was invisible to everyone who hadn't paid, and nobody subscribes to a money tracker they have never seen the inside of. Logging money is free now. Apple Calendar and Reminders were the other: reading your calendar into your agenda is how the things you already have get in, so that's free, and only writing back out is Plus.

Notifications were originally gated as a whole feature, and that was wrong. The settings screen wrapped everything in a lock, which meant a free user couldn't turn on a habit reminder — making the free tier feel broken rather than limited. It's now per kind, and the rule for which kinds is the same one: a notification telling you about something ahead of you is free, and one that looks back over a period and tells you how it went is Plus.

2Enforced twice

The Plus gate is checked in two independent places, and this is deliberate duplication.

  1. In the interface, so locked things render as locked.
  2. In the notification planner, which filters Plus-only kinds itself rather than trusting that the settings screen prevented them from being enabled.
The case that makes it necessary

Someone buys Plus, turns on quiet hours and the finance alerts, and later the entitlement stops resolving — a refund, a family-sharing change, a restore that fails on a new device. Their stored preferences still say those kinds are on. If only the settings screen enforced the gate, the planner would happily keep scheduling paid notifications indefinitely.

Checking at the point of use means the app degrades to the free tier on its own, without needing a migration to go and turn settings off — and without ever destroying the preferences, so restoring Plus brings the setup back exactly as it was.

3Where the line sits

Free
  • Every module in full, up to 500 items each
  • Money: transactions, your month's totals, Face ID lock
  • One-off todos, events and transactions
  • Journalling and journal search, uncapped
  • Meals, gratitudes, people, categories, tags, guided planning
  • Apple Calendar and Reminders read into your agenda
  • Every reminder and digest, birthdays, and the entire notification feed

One rule decides the split: the present is free, looking back is Plus. Capturing your day costs nothing, in any module, and neither does reading back every day and month you ever recorded. Plus is the layer that only exists because you kept using the app — month insights, reports over any range, export — plus the automation that repeats things for you. It is the right shape for a subscription for the same reason it's the right shape for the app: it gets more valuable the longer you stay, rather than being a toll on the front door.

Two things follow from it and are worth stating on their own. Reminders are table stakes — an organizer that won't remind you of anything unless you pay isn't a limited version, it's a broken one. And the notification feed is never paywalled: charging someone to see a record of things the app already did to them is actively hostile.

The journal follows from the same reasoning, and is the clearest case of it. Writing is free and uncapped: a cap on a journal doesn't teach someone to subscribe, it teaches them to stop writing, and an entry they didn't write is gone for good. What Plus buys is retrieval — full-text search and "on this day" — which only becomes worth anything once there are years of entries to dig through, which is to say once the free tier has already done its job.

What Plus covers is the heavier module and the fine-grained control on top — the things that make the app better for someone already using it daily, rather than the things that make it work at all.

4Not hardcoding the name

Every "Plus"-branded string in the app reads from a single constant rather than being typed inline. The tier's name isn't final, and a rename shouldn't be a search-and-replace across dozens of files where the ones inside sentences get missed.

The same applies to the settings tab's own label, which may end up being called something else — it's one constant, read by the tab bar and every reference to it.

The paywall used to advertise "unlimited categories" with no cap on categories to lift — a copy bug rather than a missing feature. That line is gone; every benefit listed on the paywall now names something the gate actually enforces, and every free-tier caption states what the free plan does give rather than only what it withholds.