Laravel in Canada
Laravel development services for Canadian businesses
Quebec's privacy law is stricter than anything else in North America and applies to anyone serving Quebec residents. That, and a sales tax that changes by province, reach the schema.
Canada gets treated as an appendix to a US build, and for the first three provinces that works. Then Quebec arrives and turns out to have the strictest privacy regime in North America, a language requirement with legal weight, and its own tax administration.
Law 25 is closer to the GDPR than to anything American
Quebec's reform of its privacy law brought in obligations that a US-shaped application does not have, and they land in the data layer rather than in the policy page.
Consent has to be specific and recorded. Not a single acceptance at signup covering everything afterwards - separate purposes, separately agreed, with a record of what was shown and when. A boolean does not survive this.
Portability is an operation. A person can ask for their data in a structured, commonly used technical format. An application that cannot produce that without engineering time is one where each request costs a day.
Transfers outside Quebec must be assessed. Not forbidden - assessed, documented, and disclosed to the person. That makes your sub-processor list and your hosting region things you maintain as records rather than things you chose once.
Privacy by default. Where a product has privacy settings, the protective value is the starting value. That is a migration default, not a UI decision.
Breaches have a reporting obligation with real penalties attached, which means incident detection needs to be good enough to know what was accessed.
Building to this standard and applying it across Canada is far cheaper than branching per province, and it makes the rest of the country trivially compliant.
French is a field, not a translation task
Quebec's language requirements cover commerce, not just marketing. Invoices, contracts and transactional communication are in scope.
For a Laravel backend that means the language belongs to the customer record and travels with it - into queued jobs that render invoices, into the mail templates, into generated PDFs. This is the failure worth naming, because it is so common: the interface is translated, and the confirmation email sent by a worker three hours later is not, because the job had no request context to read a locale from.
Dates, number formatting and currency presentation follow the same rule.
Tax, in five cases rather than three thousand
A federal tax applies everywhere. Some provinces combine it with their own into a single rate. Others charge theirs separately on top. One runs its own administration with its own registration and filing.
Concretely, this means the rate is determined by where the customer is, more than one tax can apply to a single line, and each must be tracked separately for reporting because they are remitted to different authorities.
That last point is the schema decision. A single tax_amount column cannot
express two taxes at different rates going to two places, and splitting it
afterwards means recomputing history.
Payments
Cards work as elsewhere. The domestic debit network and the bank-to-bank transfer methods Canadians actually use for larger amounts are push payments with a reference attached, so reconciliation is a matching problem rather than a webhook confirming a charge you initiated.
Pre-authorised debits have a mandate lifecycle and a return window, so the same caution applies as with any pull-based bank payment: received is not settled.
Working with us
We work remotely from Ankara. Toronto and Montreal are far enough behind that the overlap is our afternoon and your morning, which is enough for a daily conversation and not enough to work interactively all day - so the engagement is written by default.
The engineering is our usual application development and integration work. What Canada adds is that consent needs a history, language is a property of the customer rather than of the browser, and the tax model has to carry two taxes on one line without collapsing them.
Law 25 and the five tax cases both push work into the schema and not the interface, which suits Laravel. Where it does not suit, on a realtime-first product or in a team with no PHP anywhere in it, we would rather say so.
Invoicing and payment. In US dollars, or euros if your finance team prefers, by bank transfer to an IBAN. The invoice comes from Codefacture Yazılım A.Ş. in Türkiye without Turkish VAT, under the export-of-services exemption. We do not charge GST or QST and are not registered in Canada.
