Laravel in Dubai
Laravel development for Dubai companies
A Laravel development company working with Dubai teams. An hour of difference, e-invoicing through an accredited provider, and Arabic that reaches the database rather than the theme.
Dubai is an hour ahead of us and keeps the same working week, which makes this the easiest scheduling arrangement of any market we work in. Five days overlapping almost completely means a question is answered in the hour it is asked.
The work here almost always has an existing business behind it - a retail group, a logistics operation, a property portfolio - which means the application has systems to agree with rather than a blank page to fill.
A Dubai invoice becomes a document with states
This is the local specific that changes the data model rather than a setting.
Where e-invoicing runs through an accredited provider, the invoice is no longer something your application generates and emails. It is something your application builds, submits, and waits on. The provider accepts it or rejects it, and until it does, the invoice exists in your system in a state that has no equivalent in a simpler setup.
That has concrete consequences. The invoice table needs a status and a provider reference, not just a PDF path. Submission belongs on a queue with retries that are safe to repeat, because the queue will retry by design and a resubmitted invoice is a real problem. A rejection needs somewhere to go and somebody to see it, not a log line. And the interface has to be able to show a customer an invoice that is genuine but not yet cleared, which is a state most order screens were never designed for.
The numbering question comes with it. Where the authority or the provider is the system of record for sequence, your application does not get to allocate numbers freely, and an application that assumed it could is one migration away from a gap in the sequence that somebody has to explain.
In Dubai, Arabic reaches the database
The interface side of Arabic - right to left, mirrored layout, fonts - is a front-end problem and a solved one. The database side is less visible and bites harder.
Storage needs a collation that sorts Arabic correctly, which the default on many installations does not. Search needs to handle the forms of the same letter that people type interchangeably, and a name entered one way should be found when typed another. Without that, a customer record exists and nobody can find it, which presents as a data problem long before anyone suspects the collation.
Then the ordinary multilingual question: a product name in two languages is data with a lifecycle, not an interface string. It gets edited by somebody who is not a developer, reviewed and published. Putting it in a language file means a rename is a deployment, which means it does not happen, which means the Arabic version quietly falls behind.
Free zone or mainland, and what it changes in Laravel
An entity question rather than a country one, and it changes your procurement path and your own invoicing obligations rather than ours. Worth settling in the first conversation: which entity contracts, and whether its finance team has paid a foreign supplier before.
Dubai addresses and phone numbers do not fit the fields they are given
A form built elsewhere asks for a postcode and will not submit without one. There is no postcode here in the sense that form means, and the field is therefore filled with a zero, a space, or whatever the user found that the validation would accept.
Which is the general shape of the problem. Address data in the Emirates is a building name, a floor, an office, a community and sometimes a Makani number, and it is not a street number followed by a street. A schema with address line one, address line two, city, state and postcode can hold that, badly, with the useful parts crammed into free text and nothing queryable. A schema with named fields for what people actually use, plus a free-text note for the directions a driver will need, holds it well.
Phone numbers deserve the same treatment and get it less often. Stored in international form, always, with the country code, because a number stored as the user typed it is a number that cannot be dialled from a different country or matched against an incoming call. Validation that insists on a national format is the thing to remove rather than to extend - the rule that accepts anything a recognised library can parse into a valid international number is both more permissive and more correct.
The underlying lesson is worth stating because it recurs across every one of these fields. Validation that was written to describe one country's conventions does not reject bad data in another; it rejects good data, and the user responds by entering something false that passes. A false value that looks real is considerably worse for the business than a field somebody left blank.
Laravel when the Dubai customer conversation happens on WhatsApp
Email is not where the conversation is. Order confirmations, delivery notifications, the question about whether an item is in stock - those arrive and are answered on a messaging app, and an application that only sends email is sending into a void.
Which makes the channel a property of the person rather than a feature of the notification. The same event - order shipped - goes out over whichever channel that customer has, with the content shaped for it, and a fallback where the primary channel fails. Laravel's notification layer is built for exactly this, and the work is in the modelling rather than the plumbing.
Template approval is the operational constraint people are surprised by. Business-initiated messages on the major platforms must use templates submitted in advance and approved, with variables in fixed positions, and a message that does not match an approved template is simply not delivered. So templates are records in the application with their approval state, and a notification that references an unapproved template is caught in development rather than discovered as silence in production.
Inbound replies are the part most implementations drop. A customer replies to a delivery notification and the reply goes nowhere, which is worse than not messaging them at all. Treating the exchange as a conversation attached to the order - inbound and outbound, with whoever is handling it able to see the whole thread - is the difference between a notification channel and a support channel, and customers here will treat it as the second whatever it was built to be.
Commercially
The invoice comes from Codefacture Yazılım A.Ş., registered in Türkiye, in US dollars by bank transfer, with no Turkish VAT under the export-of-services exemption.
The country-level ground - the accredited provider model itself, the working week, Arabic reaching the schema - is on the UAE market page.
