These figures include simulated test payments (marked "sim" in the ledger): no money moved for those. Payments you confirm in Orders > Payments, and orders you record yourself, are real.
Profit
By package
Add-ons
By month
Transaction ledger
Tax invoices (eTIMS)
Every sale needs a KRA eTIMS invoice. Issue it on the eTIMS portal or in Risiti, then record the invoice number on the order (its Tax invoice section) and it leaves this list. Refund an invoiced order and it comes back, asking for the credit note number. Tax type: D. Check the type with your accountant before you rely on these figures.
Jump to
Order funnel
Where visits came from
By package
By page language
How this is counted
The order page counts each step once per visit: opening the page, typing in the story, reaching contact details, reaching review and pay, tapping pay, and the server accepting the paid order. It records only the step, how the visit arrived (worked out from the link and the referring site's name), the page language and the package. No cookies, no visitor IDs, nothing typed and no addresses are kept, and browsers set to Global Privacy Control or Do Not Track are not counted. Counts are approximate; read them as trends. Days older than 400 are deleted automatically.
Day by day
Promo codes
Customers type a code at Review and pay; the server works out the discount, so the page cannot change it. One code per order, and no code takes an order below half its price.
New promo code
Referral and reward codes
Every Ready order gets a referral code (KES off for a friend). When a friend pays with it, the buyer gets a single-use reward code. Erasing a customer removes theirs.
Each song moves left to right. Tap a card to open it, or use its button to move it to the next stage; on a computer you can also drag cards between columns. Delivered songs leave the board 14 days after their last change; cancelled orders stay in the list.
Month
Due Overdue or late Done Reveal day
Day
Customers who chose Pay manually paid from their own M-Pesa menu and sent the code from the M-Pesa message. Find each code in your M-Pesa messages or statement, for the same amount, then start the order. Nothing here is an order yet: no customer record, no delivery clock, and producers never see it. A payment nobody confirms is deleted, with the story sent with it, after 14 days.
Pay now attempts
Each time a customer asked for the M-Pesa prompt (Pay now): the state, the amount, the number masked and the time, newest first. When someone says "I paid" without an order, find the attempt here and in your M-Pesa messages. An attempt still waiting after 10 minutes reads expired; a payment that arrives after that is still confirmed. Attempts are deleted after 30 days; the receipt stays on the order.
Refunds due
A payment in parts that never added up is deleted with its story, but the parts you already found are kept here until you refund them: each code, its amount, the number masked (the full number is in your M-Pesa statement) and the dates. Nothing here names the customer. Mark each one refunded once the money is back; it stays as a record.
People who asked to be told when you take orders again (the waitlist) are listed first: each gets one message once orders are on, and is deleted after 30 days or when they order. Below them, people who reached the details step, ticked "you may send me one reminder", and have not paid. You keep only their first name, number and package (never the story). Each gets one reminder; they are deleted when they order, when they untick the box, or after 7 days. If someone replies STOP, delete them.
Visitors pick a language and a genre and hear a short clip with its lyric lines. The first sample is the one the card opens on. Only add clips you may publish: made in-house, or the customer agreed in writing. Host the file where your tracks live; the link is checked before it goes up.
The date customers see on the packages, at Review and pay and on their order page counts the songs already in the queue: the studio makes this many songs a week, and a song is never promised sooner than its package's time. Rush orders jump the queue. Each order keeps the date it was promised when it was paid. With new orders off, the order page shows your message instead of the form and, if you like, takes names for a waitlist (Orders & Dispatch > Unfinished).
Morning digest
Every day at 07:00 Nairobi time one message goes to your NB_ALERT_WEBHOOK: payments to check, songs due today, overdue, open corrections, lyrics and previews waiting on customers. Counts only: never a name, a number or an amount. The same run tells the devices that turned on Notify me about songs due today and overdue (a producer only about their own).
Backup
Netlify storage holds the only copy of your orders, payment proofs and consent records. Download a snapshot before any deploy that changes the data shape, and on a schedule that suits you (weekly is sensible). The file is plain JSON; keep it somewhere private, since it contains customer details. node scripts/import-backup.mjs <file> loads a snapshot into npm run dev so you can browse it offline.
Weekly copies
Saved automatically every Sunday at 05:00 Nairobi time; the newest few are kept. They live in the same Netlify account, so they protect against mistakes, not against losing the account. Keep downloading one now and then.
Recent errors
Server failures and failed scheduled jobs (backup, retention), newest first. Customers' numbers and emails are removed. Set NB_ALERT_WEBHOOK in Netlify (a Slack or Discord webhook, or a Telegram bot link) to be told when one happens; the same problem is sent at most once an hour.
Family memories: delete one on request
Someone who added a memory for a customer's song may ask you to delete it. Ask for the memories link they used (it ends in c= and a code) and their first name, paste the link here, then delete their memory. Memories that went with an order are also in that order's Story and brief.
WhatsApp Business templates
Meta only lets a business start a conversation with a template it has approved. To send from the dispatcher with WhatsApp Business, create each template below in WhatsApp Manager (Category: Utility) with exactly this name, language and body. Meta asks for an example for each {{number}}; the list says which value goes there. Until then, Open WhatsApp sends the same words from your phone.
Show the 9 templates
Pre-flight
The build checks (npm test and npm run check) run on your computer before a deploy, never on the server. This page shows the runtime side of the same contract: build version, schema match, storage, settings. If the build row below shows a different version from the one you deployed, the functions and the dashboard came from different builds.
Producers
A producer signs in with their own username and password and sees only the orders you assign to them: the story and brief, lyrics, tracks, notes and correction requests. They never see the customer's name, number, email or payment, and they cannot message customers, mark a song Delivered, cancel, refund or erase. Assign an order from its Status section.
Add a producer
Saved notes
Notes you type again and again. In any order's Internal notes, pick one to fill the box, add the details, then Add note. Producers can use them too. Removing a saved note does not touch notes already on orders.
Add a saved note
Sign-ins
Every device signed in to this dashboard right now, yours and your producers'. Sign one out if you do not recognise it, or if a phone was lost. Your own password is the ADMIN_PASSWORD setting in Netlify: to change it, set a new value there, redeploy, then sign out everyone else here.