Requirements
Apple Wallet sync requires no server-side configuration. There is no feature flag and no family allowlist — any deployment running this code serves the FinanceKit endpoints automatically. The enrolling user must be a family administrator. No Apple entitlement, private key, or FinanceKit framework is needed on the server.How it works
- The iOS app prompts the user to authorize access to Wallet accounts via FinanceKit.
- The app creates a publisher enrollment and maps the selected Apple accounts to Sure accounts.
- The app uploads encrypted batches of transactions and balances to Sure’s server.
- Sure’s background worker applies each batch in sequence, creating or updating accounts and transactions.
- Apple Card — credit card account with purchases, payments, and pending activity.
- Apple Cash — depository (cash) account with top-ups and purchases.
- Family member Apple Cash (e.g. Nancy’s Apple Cash) — a separate depository account per family member.
Viewing your connection
Once connected, Apple Wallet appears under Settings → Bank Sync alongside other providers. The panel shows:- Status —
Sync activewhen the connection is healthy, orRepair required — open the Sure iOS appwhen the connection needs attention. - Last accepted by Sure — when Sure last durably stored an upload from the device.
- Last imported into your family — when the background worker last applied a batch to your ledger.
- Linked accounts — the accounts connected through this publisher, each with a link to the account page.
Unlinking
You can unlink a Wallet connection from the web UI. Because a single publisher credential covers all selected Wallet accounts, unlinking one disconnects the entire Wallet connection and makes its accounts manual. Unlinking:- Revokes the publisher credential and queued uploads
- Preserves existing accounts, balances, transactions, and source identities
- Does not delete any financial data
Transaction dates
posted_at is optional, including for booked Apple Card transactions. When supplied, it must be a valid timestamp no later than the capture timestamp. Sure assigns ledger dates using this order of precedence: posted_at, then the required transacted_at, both converted into the mapped account’s ledger timezone.
Debugging uploads
Super admins can view upload events at/settings/debug?provider_key=financekit. Filter further by family, log level, or source. Events share connection_id, publisher_id, generation, stream_id, and next_sequence.
Diagnostics omit exception messages, financial payloads, credentials, transaction descriptions, merchant names, and amounts. Requests rejected before reaching the batch inbox (such as invalid credentials or wrong content type) do not create these events.
Demo and sample data
The standard demo account includes a synthetic Apple Wallet connection with:- Apple Card (CreditCard) — a year of purchases, payments, and pending activity
- Apple Cash (Depository, cash) — top-ups, purchases, and 1% Daily Cash rewards from Apple Card activity
- Nancy’s Apple Cash — gifts from the parent account plus small purchases
DEMO_EMAIL=<demo-user-email> (defaults to the configured demo email). SEED=42 controls generated amounts and merchants. Reruns preserve the existing enrollment and transactions and upgrade older synthetic data with merchant-specific categories and paired transfers.
Capacity limits
Payload bytes are retained for seven days after apply, permanent failure, or revocation for response-loss recovery. Financial data and source identity records follow Sure’s normal family retention and deletion behavior. A family financial-data reset removes FinanceKit connections, lineages, observations, identities, conflicts, and batch receipts for that family.
Self-hosting deployment checklist
Before accepting Apple Wallet connections on a new instance:- Deploy the migration, application, worker, and scheduler.
- Confirm the high-priority job queue and recurring
FinancekitInboxJobscheduler are healthy. - Enroll and activate a synthetic publisher over HTTPS using a disposable test family.
- Upload sequences 2 then 1 and confirm the inbox applies them in order.
- Retry identical bytes and confirm the receipt is stable with no ledger duplicates.
- Rotate the credential and confirm the prior credential cannot upload or call normal APIs.
- Replace the publisher and confirm canonical accounts, source identities, and tombstones are reused.
- Induce a bad predecessor and confirm the connection enters
repair_required; repair must create a new generation and stream. - Confirm health reports device contact, acceptance, import, and downstream completion separately.
- Confirm applied, permanently failed, and revoked payload bytes are removed after seven days.