A working archive of recent commissions across our four practices. Filter by sector;
click any project to read the case study. All imagery is reference for design — photographer
credit, couple & client consent confirmed before publishing live.
The studio runs an integrated creative + production team — one point of contact, one accountability.
{phases.map(p => (
{p.num}
{p.title}
{p.body}
))}
— Selected frames
The room, in detail.
{project.photographer}
{project.gallery.map((g, i) => (
setLb(g)}
>
{g.credit}
))}
— Next project
{next.title}
{next.sector} · {next.venue} · {next.year}
navigate('case', next.slug)}>
{/* lightbox */}
{lb && (
setLb(null)}>
{lb.credit}
)}
);
}
// ────────────────────────────────────────────────────────────────
// About
// ────────────────────────────────────────────────────────────────
function About({ navigate }) {
return (
— The studio
Twenty-one years in the room.
Couture Events FZ-LLC was founded in Dubai in 2004 — a quiet luxury practice that has, over twenty-one
years, become a familiar one. We work for couples, brands, royal households, and a long list of
private hosts. We are deliberately small, and intentionally selective.
21
Years in business
500+
Events produced
4
Practices
14
Countries delivered in
— Founder & current leadership
A studio, in two acts.
Founded by Sarah Feyling in 2004 — one of the first dedicated luxury wedding planners in the
region. Today the studio is led by Hannah Matthews, CEO & Creative Director.
ⓘ Public surname & founder status confirmation pending per design brief.
{TEAM.map((t) => (
{t.img
?
:
Portrait requested
}
{t.role}
{t.name}
{t.bio}
— {t.yrs}
{t.note &&
ⓘ {t.note}
}
))}
— Studio history
A short chronology.
Independently held since 2004 · Couture Events FZ-LLC, Dubai
{TIMELINE.map(t => (
{t.yr}
{t.title}
{t.body}
))}
— Recognition
A small shelf.
We do not chase awards. These are noted because clients ask about them — each will appear with
issuer and year, attributed and confirmed, before publishing.
{[
{ name: 'Wedding Planner of the Year', issuer: 'WeddingsOnline (regional)', year: '2024', conf: 'attribution pending confirmation' },
{ name: 'Conference of the Year', issuer: 'WOW Awards', year: '2024', conf: 'attribution pending confirmation' },
{ name: '50 Under 50, MEA — Hannah Matthews', issuer: 'industry roundup', year: '2023', conf: 'attribution pending confirmation' },
{ name: 'LinkedIn Top 200 Voices — Laura Shepherd', issuer: 'LinkedIn', year: '2024', conf: 'attribution pending confirmation' },
].map(a => (
{a.name}
{a.year}
{a.issuer} · [ {a.conf} ]
))}
);
}
// ────────────────────────────────────────────────────────────────
// Contact (multi-step form)
// ────────────────────────────────────────────────────────────────
function Contact({ navigate }) {
const [step, setStep] = useStateP(0);
const [data, setData] = useStateP({
name: '', email: '', phone: '',
sector: '', when: '', guests: '', venue: '',
message: '',
});
const [errs, setErrs] = useStateP({});
const [submitted, setSubmitted] = useStateP(false);
const sectors = [
{ id: 'weddings', label: 'Wedding', desc: 'Single or multi-day' },
{ id: 'corporate', label: 'Corporate', desc: 'Conference · launch · gala' },
{ id: 'social', label: 'Social', desc: 'Birthday · anniversary · private' },
{ id: 'proposals', label: 'Proposal', desc: 'Bespoke · couture' },
];
const set = (k) => (e) => setData(d => ({ ...d, [k]: e.target.value }));
const validate = (s) => {
const e = {};
if (s === 0) {
if (!data.sector) e.sector = 'Select an event type';
}
if (s === 1) {
if (!data.when) e.when = 'Approximate date or season';
if (!data.guests) e.guests = 'Estimated guest count';
}
if (s === 2) {
if (!data.name) e.name = 'Required';
if (!data.email || !/.+@.+\..+/.test(data.email)) e.email = 'Valid email required';
if (!data.phone) e.phone = 'Required';
}
setErrs(e);
return Object.keys(e).length === 0;
};
const advance = () => { if (validate(step)) setStep(step + 1); };
const back = () => setStep(s => Math.max(0, s - 1));
const submit = () => {
if (!validate(2)) return;
setSubmitted(true);
};
const steps = ['Practice', 'Event', 'Details'];
return (
{!submitted ? (
<>
— Enquiry
Begin a conversation.
Tell us what you have in mind. We reply within one working day with next steps. Three short
steps — no commitment, no price list.
Your enquiry routes to the studio inbox & CRM. We reply within one working day.
)}
>
) : (
✓
— Received
Thank you, {data.name.split(' ')[0] || 'and welcome'}. We will be in touch.
Your enquiry has been received by the studio. Hannah and the team reply within one working
day. For anything urgent, please message us on WhatsApp — the fastest channel.