Until this summer, Domly stopped at the ticket. A tenant texted that the kitchen sink was backing up, Lucie asked the right questions, took a photo, and handed you a clean summary. Then you put the phone down and did the actual work yourself: find the plumber's number, describe the problem again from scratch, re-send the photo the tenant had already sent, wait, follow up, and repeat the whole thing for a second quote. We had automated the part that was annoying and left the part that was slow.
So we built the next piece. You keep a directory of the trades you actually use. Your plumber, your electrician, the handyman who has a key to the mechanical room, with your own notes attached. When a ticket needs one of them, you click Get a quote. Lucie texts them, describes the job, forwards the tenant's photo, asks for a price and availability, and chases once if nobody answers. Every message is logged and readable. What she cannot do, under any circumstance, is accept the price.
That last sentence is the whole product. An assistant that texts your contractors is convenient. An assistant that can commit you to a $4,000 repair is something you would be right to refuse to install. The obvious design is a threshold: let it approve anything under fifty dollars and escalate the rest. We built and then deliberately removed that idea, because a threshold is a number somebody has to defend the first time a $49 service call turns into a $4,900 invoice. There is no dollar amount below which we will agree to pay a contractor on your behalf. Approving is a button, and only you can press it.
Making that true took more than telling the model to behave. Prompts are requests, not guarantees. So every message Lucie writes to a contractor is re-read by ordinary code before it is sent. A few hundred lines that look for agreement in English and French, including the Québécois phrasings a plumber actually uses. If it finds any, the message is replaced with a holding reply along the lines of I will confirm with the owner and come right back to you, and you get told it happened. Underneath that, the message that accepts a quote cannot even be composed unless a row in our database says you approved that specific amount. Two independent controls, neither of which trusts the AI to police itself. We are candid about the limit: this defends against the model getting it wrong, not against a model deliberately hiding what it is doing. Nothing at that layer could.
Then there is the contractor's side, which is where Canadian law stops being an abstraction. Texting a business on someone's behalf is a commercial electronic message under CASL, so consent is not optional. When you add a contractor, you confirm you already have a business relationship with them, meaning you have hired them or they quoted you, because that is what CASL recognises as implied consent. Lucie identifies herself as an assistant and answers honestly if she is asked whether she is a machine. If a contractor replies STOP, in any of the forms people actually type it, that is permanent and immediate: their threads close, any photo links we sent them are revoked, and there is no button anywhere in the product to undo it. Adding them back means asking their permission again, which is the point. We also nudge exactly once per job, ever. A system that keeps texting small businesses until they answer is how a phone number gets reported, and we would deserve it.
Quebec adds its own paperwork, and we decided to do that reading for you. Contractor profiles hold an RBQ licence number, a GST number and a QST number, all optional, because nobody adding a plumber from a business card has them memorized. Upload a quote or an invoice and we read them off it and fill in whatever is still blank. What we will not do is overwrite something already there. If the document disagrees with the number on file, we tell you both values and change nothing, because a tax number quietly replaced because a scanned PDF disagreed is the kind of error nobody notices until an invoice is wrong. The machine proposes. You dispose. That rule shows up everywhere in this feature once you start looking.
The part we did not expect to matter as much as it does is what this changes for the tenant. Most of the frustration in a repair is not the repair. It is the silence in the middle, the days between reporting a leak and hearing anything back, when the tenant has no idea whether anyone is doing anything. That silence is rarely indifference. It is a landlord with a day job who has not had a free hour to make three phone calls. Compressing that gap from days to hours does not just fix the sink faster. It removes the part of the process that makes a reasonable tenant start to feel ignored, and it is a great deal cheaper than the goodwill you spend rebuilding a relationship after they have. Under Quebec law you owe your tenant a dwelling in a fit state of habitation and peaceable enjoyment of it. Answering faster is not a nice extra; it is the obligation, met earlier.
Some things we have not solved, and would rather say so than let you find out. Our quote-reading has been tested against examples we wrote ourselves, which means it handles the shapes we anticipated and tells us little about a real contractor's reply typed one-handed from a van. Photos forwarded to a contractor still carry whatever location data the tenant's phone attached, and stripping that is on the list. And every conversation still sits behind your approval, which means this saves you the twenty minutes of chasing, not the thirty seconds of deciding. We think that is the correct split. The day it feels like a limitation is the day to be suspicious of anyone offering to remove it.
Ready to let AI handle your tenant messages?
Start free with Domly