Design system · The Authority Ledger

Component and CTA library

Every part of LinkBuildingService.ae, rendered live from site.css, with the conversion rule that decides where it goes. Build new pages from these parts. If something you need is missing, flag it before you invent it.

.btn--primary
Production class from site.css. Copy the snippet as it is.
Proposed
Lives in components.css with a cl- prefix. Promote it to site.css before other pages use it.
AED 0,000
Invented content wrapped in .ph. Turn on "Show placeholders" to outline every one.
1

conversion color: emerald, for actions only

8

CTA patterns that all ask for the same thing

66

icons in one inline sprite

2

typefaces: Instrument Sans and Geist Mono

Foundations

Tokens, type, space and icons

Every value here is a custom property on :root in site.css. Page CSS reads var(--token) and nothing else: no raw hex, no new fonts, no one-off shadows.

Color

--ink--paper--mist--brand

A neutral ground of ink, paper and mist, ruled by hairlines. One conversion color on top.

The one color rule

Emerald is reserved for conversion.

Use --brand for primary buttons, live states, key numbers and small accents such as eyebrow dots and check ticks. When emerald only ever means "act here", the audit button is the most salient object on every screen. On ink grounds switch to --brand-bright with ink text.

Gets emerald

.btn--primary and .btn--on-dark, .link-arrow, .live-dot, key numbers with .hl, check ticks, the selected option, the "you" series in a chart

Never emerald

Section fills, illustrations, decorative icons, headings, card borders, competitor series, large backgrounds of any kind

Squint test: the only color left on the screen is the action.

Paper: grounds, lines and text

  • --paper#FFFFFFDefault page ground and cards
  • --mist#F4F6F3Alternate section ground, hover fills
  • --mist-2#EBEFEASegmented control track, avatars
  • --line#E2E6E1Hairlines, card and table borders
  • --line-strong#CBD2CCInput and secondary button borders
  • --text#0B1215Headings and body copy
  • --text-2#46524DSecondary copy and leads. 7.9:1 on paper
  • --text-3#66716CCaptions and meta. 4.9:1 on paper

Emerald: conversion only

  • --brand#0A6B4FPrimary buttons, links, live states, key numbers
  • --brand-hover#085A42Hover state of the primary button
  • --brand-ink#053A2BText on emerald tints
  • --brand-tint#E5F1EBInline CTA ground, selected option, icon tile
  • --brand-tint-2#CFE6DABorders on tinted grounds

Ink: dark sections and the footer

  • --ink#0B1215Dark surfaces, the footer, the CTA band
  • --ink-2#141D21Raised surface on ink: inputs, cards
  • --ink-3#222E33Hairlines and outlines on ink
  • --text-on-dark#F3F6F4Primary text on ink
  • --text-on-dark-2#A9B6B0Secondary text on ink
  • --brand-bright#2FC28AEmerald on ink, always with ink text
  • --brand-bright-hover#4FD3A0Hover state of .btn--on-dark
  • --danger-on-dark#FF9B8FForm errors on ink

Signals and channels

  • --star#E8A317Rating stars. Nothing else
  • --danger#B42318Form errors on paper
  • --warn#B45309Pending states, placeholder outlines
  • --warn-tint#FDF1E3Ground of the warn badge
  • --whatsapp#25D366WhatsApp glyph on ink. Icon only
  • --whatsapp-ink#128C4AWhatsApp glyph on light grounds
  • --info#1E5BB8Defined, unused. Ask before using
  • --sand#F3ECDDRare warm highlight. Unused so far

Type scale

--font-sans--font-mono--fs-*

Instrument Sans for everything, Geist Mono for data, labels and eyebrows. Headlines are weight 600 with tight tracking. No weights above 700, no other fonts, no all-caps headings (mono labels are the only uppercase).

Instrument Sans

Headlines, body and interface. 600 for headings and buttons, 500 for nav and labels, 400 for copy.

Regular 400Medium 500Semibold 600Bold 700

Geist Mono

DR, traffic, prices in tables, eyebrows and code. Use .mono for the slashed zero and .num for tabular figures.

0123456789DR · dofollow · AED

.display--fs-display42 → 76px · 600 · 1.04 · −0.035emHome hero only

Links that last

h1, .h1--fs-h136 → 60px · 600 · 1.06 · −0.035emOne per page

Link building for Dubai real estate

h2, .h2--fs-h230 → 48px · 600 · 1.1 · −0.025emSection titles

You approve every site first

h3, .h3--fs-h320 → 24px · 600 · 1.18 · −0.015emCard and block titles

Editorial guest posts on vetted UAE sites

h4, .h4--fs-h418px · 600 · 1.3 · −0.01emSmall titles, price tiers

12-month replacement guarantee

.lead--fs-lead18 → 21px · 400 · 1.5 · --text-2Intro under a headline

A strategist compares your backlinks with your top three competitors' and sends the gaps within 48 hours.

body--fs-body17px · 400 · 1.6Default copy

We only place links on sites with real organic traffic. You see every domain, its DR and a sample page before outreach starts.

.small--fs-sm15px · 400Card copy, lists, tables

Prices in AED, excluding 5% VAT. VAT invoices show our TRN.

.xsmall, .btn-note--fs-xs13px · 400 · --text-3Micro-copy under CTAs

Delivered in 48 hours · No lock-in · 12-month replacement guarantee

.eyebrow--fs-micro12px mono · 500 · +0.08em · uppercaseLabels above headings

Free link gap audit

.mono .num--font-monoTabular figuresData in tables and cards

DR 54 · 12.4K/mo · dofollow · AED 1,090

Spacing and layout

--s-1 … --s-10--section-y--gutter

A 4px base. Use the steps, never values between them. Section padding and gutters are fluid.

  • --s-14pxHairline gaps, icon nudges
  • --s-28pxChip and button groups
  • --s-312px.cluster default gap
  • --s-416px.stack default gap
  • --s-524px.grid gap, .ledger padding
  • --s-632pxCard padding at desktop
  • --s-748pxBetween blocks inside a section
  • --s-864pxSection head to content
  • --s-996pxBetween major sections
  • --s-10128pxUpper bound of --section-y
--section-y
72 → 128px
Vertical padding of .section
--gutter
20 → 32px
Container side padding
--container
1240px
.container max width
--container-narrow
820px
.container--narrow for articles, legal
--header-h
72px
Sticky header, scroll offset

Radii and shadows

--r-*--shadow-*--ring

Soft corners, flat surfaces. Shadows are for things that float or that you want touched: menus, the modal, placement cards, the featured price.

  • --r-xs4pxInline code, small tags
  • --r-sm6pxSkip link
  • --r-md10pxButtons, inputs, icon tiles, options
  • --r-lg16pxCards, placement, price cards
  • --r-xl22pxCTA band, modal
  • --r-pill999pxBadges, chips, WhatsApp float
  • --shadow-xsQuiet lift: active segment
  • --shadow-cardPlacement cards, raised cards, domain form
  • --shadow-popMega menu, modal, featured price card, WhatsApp float
  • --ringKeyboard focus on buttons and fields

Icon set

.i.icon-tile#i-NAME

One inline sprite, injected by @header. 24px grid, 1.75 stroke, round caps. Icons inherit currentColor. Mark decorative icons aria-hidden="true". Never use emoji.

Live · Icon usageon --paper
Code6 lines
HTML
<div class="cluster" style="--cluster:24px">
  <svg class="i" aria-hidden="true"><use href="#i-link"/></svg>
  <span class="icon-tile"><svg class="i" aria-hidden="true"><use href="#i-pen"/></svg></span>
  <a class="link-arrow" href="/#pricing">See pricing<svg class="i" aria-hidden="true"><use href="#i-arrow"/></svg></a>
  <a class="btn btn--primary" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
</div>

Interface 24

  • i-arrow
  • i-arrow-left
  • i-arrow-up-right
  • i-chevron-down
  • i-chevron-right
  • i-check
  • i-check-circle
  • i-x
  • i-plus
  • i-minus
  • i-menu
  • i-search
  • i-copy
  • i-sliders
  • i-download
  • i-refresh
  • i-eye
  • i-lock
  • i-play
  • i-info
  • i-alert
  • i-ban
  • i-clock
  • i-calendar

Contact 6

  • i-phone
  • i-whatsapp
  • i-mail
  • i-map-pin
  • i-message
  • i-globe

Link building and proof 18

  • i-link
  • i-trend
  • i-bars
  • i-gauge
  • i-target
  • i-audit
  • i-layers
  • i-pen
  • i-newspaper
  • i-languages
  • i-file
  • i-book
  • i-receipt
  • i-zap
  • i-shield
  • i-trophy
  • i-star
  • i-quote

Industries 12

  • i-home
  • i-bed
  • i-pulse
  • i-scale
  • i-bank
  • i-cart
  • i-cap
  • i-code
  • i-car
  • i-sparkle
  • i-truck
  • i-hardhat

People and social 6

  • i-users
  • i-briefcase
  • i-linkedin
  • i-xsocial
  • i-instagram
  • i-youtube
Buttons

Six variants, three sizes, one primary

Buttons are .btn plus one variant and at most one size. The trailing arrow (.i-arrow) nudges 3px on hover. Leading icons name a channel: calendar, phone, WhatsApp.

Variants on paper

.btn--primary.btn--secondary.btn--dark.btn--ghost
Live · Variants × sizeson --paper

.btn--primaryThe audit. One per view.

Get my free audit Get my free audit Get my free audit

.btn--secondaryThe path beside a primary.

See pricing See pricing See pricing

.btn--darkA committed secondary. Never in the same group as a primary.

Book a strategy call Book a strategy call Book a strategy call

.btn--ghostTertiary actions, toolbars, card footers.

See results See results See results
Variants and sizes11 lines
HTML
<!-- Variants -->
<a class="btn btn--primary" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
<a class="btn btn--secondary" href="/#pricing">See pricing</a>
<a class="btn btn--dark" href="/contact/"><svg class="i" aria-hidden="true"><use href="#i-calendar"/></svg>Book a strategy call</a>
<a class="btn btn--ghost" href="/#results">See results<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>

<!-- Sizes: add at most one -->
<a class="btn btn--primary btn--sm" href="/contact/">…</a>    <!-- 40px: header, dense UI -->
<a class="btn btn--primary" href="/contact/">…</a>            <!-- 48px: default -->
<a class="btn btn--primary btn--lg" href="/contact/">…</a>    <!-- 56px: hero and closing CTAs -->
<a class="btn btn--primary btn--block" href="/contact/">…</a> <!-- full width: cards, forms, modal -->

Variants on ink

.btn--on-dark.btn--outline-dark

Inside .section--ink, .cta-band and the footer. Bright emerald with ink text is the primary; the outline is the secondary.

Live · Variants on inkon --ink · .section--ink

.btn--on-darkThe audit, on ink.

Get my free audit Get my free audit Get my free audit

.btn--outline-darkWhatsApp, call, or See pricing on ink.

WhatsApp us WhatsApp us WhatsApp us
See pricing

.link-arrow and .btn-note switch to their on-ink colors inside .section--ink.

On ink6 lines
HTML
<section class="section section--ink">
  <div class="container cluster">
    <a class="btn btn--on-dark btn--lg" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
    <a class="btn btn--outline-dark btn--lg" href="https://wa.me/971500000000" data-wa><svg class="i i--wa" aria-hidden="true"><use href="#i-whatsapp"/></svg>WhatsApp us</a>
  </div>
</section>

Block buttons and states

.btn--block:hover:focus-visible
Live · Inside a cardon --mist
Get my free audit Book a strategy call

Delivered in 48 hours · No lock-in · 12-month replacement guarantee

Block buttons5 lines
HTML
<div class="card">
  <a class="btn btn--primary btn--block" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
  <a class="btn btn--secondary btn--block" href="/contact/"><svg class="i" aria-hidden="true"><use href="#i-calendar"/></svg>Book a strategy call</a>
  <p class="btn-note">Delivered in 48 hours · No lock-in · 12-month replacement guarantee</p>
</div>
Live · States, simulatedon --paper
  • Get my free auditDefault
  • Get my free auditHover · --brand-hover, arrow +3px
  • Get my free auditKeyboard focus · --ring
  • Get my free auditPressed · 1px down

When to use

.btn--block inside cards, forms and the modal, up to about 480px wide. On phones, .domain-form and .cta-inline already stretch their button to full width.

CRO rule

Keep the focus ring. Keyboard and switch users convert too, and the ring is the same emerald as the action.

CTA copy rules

.link-arrow.btn-note.trust-list

Wording is part of the component. These three rules apply on every page, in every section, in both languages.

One verb, repeated

The primary says "Get my free audit" everywhere. The header shortens it to "Get free audit" for space. That's the only variation.

  • Request a quote
  • Get started
  • Let's talk
  • Learn more

Fixed secondary wording

Secondary paths are fixed phrases too: "See pricing", "Book a strategy call", "See results", "WhatsApp us". Set them as .link-arrow or .btn--secondary, never as a second primary in the same group.

Trust micro-copy

Get my free audit

Delivered in 48 hours · No lock-in · 12-month replacement guarantee

Directly under the primary: one line, three facts, middle dots between them. Facts, never adjectives. Use .trust-list with icons when the line sits under a domain form.

CTA patterns

Eight ways to ask, one thing to ask for

Every pattern asks for the free link gap audit, apart from the lead magnet, which catches people who aren't ready yet. Each pattern has a fixed job and a fixed place on the page.

Placement map

Long page, top to bottom
  1. Header Header button"Get free audit" in the sticky header. Below 420px the mobile sticky bar carries the audit.
  2. Hero ADomain captureWith trust micro-copy and the Google rating in the same glance.
  3. Proof No askLogos, ledger stats, placement cards. Earn the next CTA.
  4. Services BInline CTA or link-arrows"See pricing" under each service; .cta-inline in long copy.
  5. Results Proof againCase-study cards with numbers and timeframes.
  6. Mid-page band CCTA bandRoughly halfway down, right after proof.
  7. Pricing DHPrice-card CTAsPlus risk reversal and the book-a-call card.
  8. FAQ ObjectionsPrice, contract, safety, approval, timeline, reporting, Arabic. A link to pricing at most.
  9. Footer GPre-footer CTACloses every page via @footer.
Rhythm rule

Proof, then ask. Repeat.

  • A conversion point every 1.5 to 2 screens, each one after a block of proof.
  • One primary verb from the header to the footer.
  • Never two closing CTAs in a row: no band directly above the footer.

Always on, outside the flow

FWhatsApp float on desktop; on phones, a sticky bar from the first screen.

EExit-intent modal with the price guide, desktop only, once per session.

AHero domain capture

.domain-form[data-domain-form][data-domain-error].trust-list

Try it: submit it empty to see the error, or enter a domain to go to /contact/ with the domain prefilled.

Live · Hero, first screenon --paper
Link building for UAE businesses

Editorial links from sites your buyers already read.

Hand-placed links on vetted UAE and GCC sites with real traffic. You approve every site before outreach starts.

  • Delivered in 48 hours
  • No lock-in
  • 12-month replacement guarantee
4.9 on Google · 87 reviews
Hero domain capture25 lines
HTML
<div class="stack" style="--stack:24px">
  <span class="eyebrow">Link building for UAE businesses</span>
  <p class="h1 cl-maxw-hero">Editorial links from sites your buyers already read.</p>
  <p class="lead measure-narrow">Hand-placed links on vetted UAE and GCC sites with real traffic. You approve every site before outreach starts.</p>
  <div>
    <form class="domain-form" data-domain-form action="/contact/" novalidate>
      <label class="visually-hidden" for="hero-domain">Your website</label>
      <div class="domain-form__field">
        <svg class="i" aria-hidden="true"><use href="#i-globe"/></svg>
        <input id="hero-domain" name="domain" type="text" inputmode="url" autocomplete="url" placeholder="yourcompany.ae" aria-describedby="hero-domain-error">
      </div>
      <button class="btn btn--primary" type="submit">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></button>
    </form>
    <p id="hero-domain-error" data-domain-error role="alert" hidden></p>
  </div>
  <ul class="trust-list">
    <li><svg class="i" aria-hidden="true"><use href="#i-clock"/></svg>Delivered in 48 hours</li>
    <li><svg class="i" aria-hidden="true"><use href="#i-refresh"/></svg>No lock-in</li>
    <li><svg class="i" aria-hidden="true"><use href="#i-shield"/></svg>12-month replacement guarantee</li>
  </ul>
  <div class="rating">
    <span class="stars" aria-hidden="true"><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg></span>
    <span><strong class="ph">4.9</strong> on Google · <span class="ph">87 reviews</span></span>
  </div>
</div>

When to use

The first screen of every page that sells: home, services, industries, locations. One field, because a domain is all a strategist needs to start. site.js validates it, stores it for the session and prefills [data-prefill-domain] on /contact/.

CRO rule

Primary CTA above the fold, trust micro-copy directly under it, the Google rating with its count in the same glance. The error says what to type, never just "invalid". Keep the [data-domain-error] element inside the form's parent; it has its own on-ink color.

BInline content CTA

.cta-inline
Live · Inside an articleon --paper

Most UAE sites we audit have the same shape: plenty of directory listings and almost no editorial links from sites that write about their industry. That gap is where competitors pull ahead.

Closing it starts with knowing which of their links you can realistically earn, and which came from sources you should never touch.

Inline CTA7 lines
HTML
<aside class="cta-inline" aria-label="Free link gap audit">
  <div class="stack" style="--stack:6px">
    <p class="h4">Want to see your own gap?</p>
    <p>We compare your backlinks with your top three competitors' and send the ranked list within 48 hours.</p>
  </div>
  <a class="btn btn--primary" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
</aside>

When to use

Blog articles, guides and long service copy. Once per article, after the section that describes the problem the audit solves. Never in an article's first screen.

CRO rule

Write the headline for the paragraph above it. The button wording never changes. On phones the button goes full width on its own.

CMid-page CTA band

.cta-band.cta-band__grid
Live · Middle of a long pageon --mist

Your competitors' backlinks are public. So is the gap.

Send your domain. A strategist maps it against your top three competitors and replies within 48 hours.

  • You approve every site
  • Month to month
  • 12-month replacement guarantee
CTA band22 lines
HTML
<div class="cta-band">
  <div class="stack" style="--stack:20px">
    <p class="h2 cl-maxw-band">Your competitors' backlinks are public. So is the gap.</p>
    <p class="lead measure-narrow">Send your domain. A strategist maps it against your top three competitors and replies within 48 hours.</p>
    <div>
      <form class="domain-form" data-domain-form action="/contact/" novalidate>
        <label class="visually-hidden" for="band-domain">Your website</label>
        <div class="domain-form__field">
          <svg class="i" aria-hidden="true"><use href="#i-globe"/></svg>
          <input id="band-domain" name="domain" type="text" inputmode="url" autocomplete="url" placeholder="yourcompany.ae" aria-describedby="band-domain-error">
        </div>
        <button class="btn btn--on-dark" type="submit">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></button>
      </form>
      <p id="band-domain-error" data-domain-error role="alert" hidden></p>
    </div>
    <ul class="trust-list">
      <li><svg class="i" aria-hidden="true"><use href="#i-check-circle"/></svg>You approve every site</li>
      <li><svg class="i" aria-hidden="true"><use href="#i-refresh"/></svg>Month to month</li>
      <li><svg class="i" aria-hidden="true"><use href="#i-shield"/></svg>12-month replacement guarantee</li>
    </ul>
  </div>
</div>

When to use

Once per long page, around the middle, after proof or the process section. In a full 1240px container use .cta-band__grid for two columns. In narrower containers keep one column so the domain field stays wide.

CRO rule

Never directly above the footer: the pre-footer CTA already closes the page. Use .btn--on-dark inside the band; the emerald-on-ink button is the only bright object in it.

DPricing card CTAs

.price-card.price-card--featured.price-card__flag.check-listProposed.cl-price-grid.cl-drmix
Live · Pricing section, two of three tierson --mist

Launch

For a new site or one priority page building its first real authority.

AED5,900/ month

Excl. 5% VAT · ≈ AED 1,180 per link

5 links a month

4 × DR 30–491 × DR 50–69

  • You approve every site before outreach
  • English outreach and content
  • Live reporting dashboard
  • Native Arabic outreach
Get my free audit
  • 12-month replacement guarantee
  • You approve every site first
  • Month to month, no lock-in
Price cards52 lines
HTML
<div class="stack" style="--stack:28px">
  <div class="grid grid-2 cl-price-grid">
    <article class="price-card">
      <div class="stack" style="--stack:6px">
        <h4>Launch</h4>
        <p class="small muted">For a new site or one priority page building its first real authority.</p>
      </div>
      <div class="stack" style="--stack:8px">
        <div class="price-card__price"><span class="price-card__cur">AED</span><span class="price-card__amount ph">5,900</span><span class="price-card__per">/ month</span></div>
        <p class="xsmall subtle">Excl. 5% VAT · ≈ AED <span class="ph num">1,180</span> per link</p>
      </div>
      <div class="cl-drmix">
        <p><strong class="ph">5 links</strong> a month</p>
        <p class="cl-drmix__bands"><span><span class="ph">4</span> × DR 30–49</span><span><span class="ph">1</span> × DR 50–69</span></p>
      </div>
      <ul class="check-list">
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>You approve every site before outreach</li>
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>English outreach and content</li>
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>Live reporting dashboard</li>
        <li class="is-off"><svg class="i" aria-hidden="true"><use href="#i-minus"/></svg>Native Arabic outreach</li>
      </ul>
      <a class="btn btn--secondary btn--block card__foot" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
    </article>
    <article class="price-card price-card--featured">
      <span class="badge badge--dark price-card__flag">Most chosen</span>
      <div class="stack" style="--stack:6px">
        <h4>Growth</h4>
        <p class="small muted">For businesses competing for commercial terms on page one in one market.</p>
      </div>
      <div class="stack" style="--stack:8px">
        <div class="price-card__price"><span class="price-card__cur">AED</span><span class="price-card__amount ph">10,900</span><span class="price-card__per">/ month</span></div>
        <p class="xsmall subtle">Excl. 5% VAT · ≈ AED <span class="ph num">1,090</span> per link</p>
      </div>
      <div class="cl-drmix">
        <p><strong class="ph">10 links</strong> a month</p>
        <p class="cl-drmix__bands"><span><span class="ph">6</span> × DR 30–49</span><span><span class="ph">3</span> × DR 50–69</span><span><span class="ph">1</span> × DR 70+</span></p>
      </div>
      <ul class="check-list">
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>You approve every site before outreach</li>
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>English and native Arabic outreach</li>
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>Live reporting dashboard</li>
        <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>Quarterly backlink audit</li>
      </ul>
      <a class="btn btn--primary btn--block card__foot" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
    </article>
  </div>
  <ul class="trust-list">
    <li><svg class="i" aria-hidden="true"><use href="#i-shield"/></svg>12-month replacement guarantee</li>
    <li><svg class="i" aria-hidden="true"><use href="#i-check-circle"/></svg>You approve every site first</li>
    <li><svg class="i" aria-hidden="true"><use href="#i-refresh"/></svg>Month to month, no lock-in</li>
  </ul>
</div>

When to use

The pricing section (/#pricing) and service pages. Three tiers plus a custom tier for agencies and multi-site groups. Every tier's button starts with the audit. .cl-price-grid puts the cards on shared rows, so names, prices, DR mix, lists and buttons line up across tiers.

CRO rule

AED, shown openly, excl. 5% VAT. Show the DR mix and the per-link price as an anchor. "Most chosen" on the middle tier, which alone gets the primary button. Risk reversal sits directly under the cards.

ELead magnet and exit intent

Proposed.cl-magnet[data-open-modal]#lead-modal
Live · Resources, blog sidebar, 404on --paper
Free PDF · 24 pages

Know what links should cost before you buy any.

What a DR 30, 50 and 70 link costs in AED, price ranges for 12 UAE industries, and the signs a seller is reselling PBNs.

One email with the PDF. No newsletter unless you ask for it.

Lead-magnet card21 lines
HTML
<div class="cl-magnet">
  <div class="cl-magnet__cover" aria-hidden="true">
    <span class="cl-magnet__label">Price guide · <span class="ph">2027</span></span>
    <span class="cl-magnet__title">UAE Link Building Price Guide <span class="ph">2027</span></span>
    <span class="cl-magnet__rows">
      <span><b>DR 30–49</b><i style="width:34%"></i></span>
      <span><b>DR 50–69</b><i style="width:60%"></i></span>
      <span><b>DR 70+</b><i style="width:90%"></i></span>
    </span>
    <span class="cl-magnet__foot">linkbuildingservice.ae</span>
  </div>
  <div class="stack cl-magnet__body" style="--stack:16px">
    <span class="eyebrow">Free PDF · <span class="ph">24 pages</span></span>
    <p class="h3">Know what links should cost before you buy any.</p>
    <p class="muted">What a DR 30, 50 and 70 link costs in AED, price ranges for <span class="ph">12</span> UAE industries, and the signs a seller is reselling PBNs.</p>
    <div class="cluster">
      <button class="btn btn--dark" type="button" data-open-modal><svg class="i" aria-hidden="true"><use href="#i-download"/></svg>Get the price guide</button>
    </div>
    <p class="btn-note">One email with the PDF. No newsletter unless you ask for it.</p>
  </div>
</div>

Opens the real #lead-modal from @footer. Exit intent fires on desktop only, after 8 seconds, once per session, and never on pages whose body has data-no-exit (this page, contact, thank-you).

When to use

Resources, blog sidebars, the 404 page and the Resources mega menu. Any element with data-open-modal opens the modal; no extra JS.

CRO rule

The guide is tertiary. It catches visitors who aren't ready for an audit, so it never gets the emerald primary. The modal's success state offers the audit next.

FWhatsApp float and mobile sticky bar

.wa-float.sticky-cta[data-sticky-cta][data-wa]

Both ship with @footer and are fixed to the viewport, so these are static replicas. site.js prefills every WhatsApp link with the page name from <meta name="lbs:page">.

Replicas · not fixeddesktop 761px+ · phone 760px and below
.wa-float Desktop and tablet. Ink pill, bottom right, WhatsApp glyph and a status dot. Hidden at 760px and below.
.sticky-cta Phones only. Call, WhatsApp and the primary. Visible from the first screen and slides away while the footer CTA is in view.
Markup in footer.html11 lines
HTML
<a class="wa-float" href="https://wa.me/971500000000" data-wa aria-label="Chat with us on WhatsApp">
  <svg class="i" aria-hidden="true"><use href="#i-whatsapp"/></svg><span>Chat on WhatsApp</span><span class="wa-float__status" aria-hidden="true"></span>
</a>

<div class="sticky-cta" data-sticky-cta>
  <a class="btn btn--secondary btn--icon" href="tel:+97140000000" aria-label="Call us"><svg class="i" aria-hidden="true"><use href="#i-phone"/></svg></a>
  <a class="btn btn--secondary btn--icon wa" href="https://wa.me/971500000000" data-wa aria-label="WhatsApp us"><svg class="i" aria-hidden="true"><use href="#i-whatsapp"/></svg></a>
  <a class="btn btn--primary" href="/contact/">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></a>
</div>

<!-- Opt a page out of the sticky bar: <body data-no-sticky> -->

When to use

Every page gets both from @footer. Opt out of the sticky bar with data-no-sticky on the body only where the page's own next step would compete with it, as on thank-you. On a first visit the cookie notice holds the sticky bar back until a choice is made.

CRO rule

WhatsApp is how UAE buyers ask a first question. Keep it one tap away, but never let it outrank the audit: on phones the primary takes the widest slot.

GPre-footer CTA

.footer-cta@footer@footer cta="none"
Anatomy · the real one closes this pageinside .site-footer
  • The biggest headline after the hero, about the gap, never about us.
  • .btn--on-dark .btn--lg for the audit, .btn--outline-dark for WhatsApp.
  • One promise line under the buttons in .btn-note.
Footer markers2 lines
HTML
<!-- @footer -->            pre-footer CTA + footer + WhatsApp float + sticky bar + modal + cookie notice
<!-- @footer cta="none" --> the same without the pre-footer CTA, for pages that end in their own closing CTA

When to use

Automatically on every page. Use cta="none" only on contact and thank-you, which already end in a form or next step.

CRO rule

Don't stack closing CTAs. If your page wants a big ask near the end, move it up to mid-page as a .cta-band and let the footer close.

HBook-a-call card

Proposed.cl-call.cl-avatar
Live · Beside pricing, on contacton --mist

Rania Haddad

Head of Strategy · English and Arabic

Rather talk it through first?

Book 20 minutes with the strategist who would run your campaign. We look at your site and your closest competitor together.

  • Video or phone, your choice
  • No pitch deck, no follow-up sequence

Replies within 2 business hours · Mon–Fri, 9:00–18:00 GST

Book-a-call card22 lines
HTML
<article class="card card--raised cl-call">
  <div class="cl-call__who">
    <span class="cl-avatar" aria-hidden="true"><span class="ph">RH</span></span>
    <div>
      <p class="cl-call__name"><span class="ph">Rania Haddad</span></p>
      <p class="xsmall subtle">Head of Strategy · English and Arabic</p>
    </div>
  </div>
  <div class="stack" style="--stack:8px">
    <h4>Rather talk it through first?</h4>
    <p class="small muted">Book 20 minutes with the strategist who would run your campaign. We look at your site and your closest competitor together.</p>
  </div>
  <ul class="check-list">
    <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>Video or phone, your choice</li>
    <li><svg class="i" aria-hidden="true"><use href="#i-check"/></svg>No pitch deck, no follow-up sequence</li>
  </ul>
  <div class="cluster" style="--cluster:10px">
    <a class="btn btn--dark" href="/contact/"><svg class="i" aria-hidden="true"><use href="#i-calendar"/></svg>Book a strategy call</a>
    <a class="btn btn--ghost" href="https://wa.me/971500000000" data-wa><svg class="i i--wa" aria-hidden="true"><use href="#i-whatsapp"/></svg>WhatsApp us</a>
  </div>
  <p class="btn-note cl-call__sla"><svg class="i" aria-hidden="true"><use href="#i-clock"/></svg>Replies within 2 business hours · Mon–Fri, 9:00–18:00 GST</p>
</article>

When to use

Beside or under pricing, on contact, and at the end of case studies, for buyers who would rather talk than fill in a form.

CRO rule

Humans, not a faceless agency: name the strategist, show an initials avatar and promise a reply time. "Book a strategy call" is secondary, so it's .btn--dark, never emerald.

Trust and proof

Proof sits next to the claim

Ratings with counts, metrics with timeframes, placements with DR and traffic. Every number here is a placeholder until the client supplies real ones.

Rating row and review badges

.rating.starsProposed.cl-review
Live · Under hero CTAs, beside pricingon --paper
Ratings and review badges18 lines
HTML
<div class="stack" style="--stack:24px">
  <div class="rating">
    <span class="stars" aria-hidden="true"><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg></span>
    <span><strong class="ph">4.9</strong> on Google · <span class="ph">87 reviews</span></span>
  </div>
  <div class="cluster" style="--cluster:10px">
    <a class="cl-review" href="#">
      <span class="cl-review__src">Google</span>
      <span class="stars" aria-hidden="true"><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg></span>
      <span class="cl-review__score"><strong class="ph">4.9</strong><span class="ph">87 reviews</span></span>
    </a>
    <a class="cl-review" href="#">
      <span class="cl-review__src">Clutch</span>
      <span class="stars" aria-hidden="true"><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg><svg class="i"><use href="#i-star"/></svg></span>
      <span class="cl-review__score"><strong class="ph">4.9</strong><span class="ph">31 reviews</span></span>
    </a>
  </div>
</div>

When to use

.rating in the hero and under pricing. .cl-review badges on light grounds where .footer-badge (ink only) can't go: contact, case studies, the about page.

CRO rule

Google first; Google reviews carry the most weight with UAE buyers. Always show the count beside the score, and link the badge to the real profile.

Trust list

.trust-list
Live · Under a formon --paper
  • Delivered in 48 hours
  • No lock-in
  • 12-month replacement guarantee
Trust list5 lines
HTML
<ul class="trust-list">
  <li><svg class="i" aria-hidden="true"><use href="#i-clock"/></svg>Delivered in 48 hours</li>
  <li><svg class="i" aria-hidden="true"><use href="#i-refresh"/></svg>No lock-in</li>
  <li><svg class="i" aria-hidden="true"><use href="#i-shield"/></svg>12-month replacement guarantee</li>
</ul>
Live · On inkon --ink · .section--ink
  • You approve every site
  • English and Arabic outreach
  • VAT invoices in AED

Logo strip

.logo-strip.logo-strip__itemProposed.cl-logo-grid
Live · Directly under the heroon --paper

UAE teams we've built links for

  • Marina Crest
  • Oasis Clinics
  • Falcon Freight
  • Dune Capital
  • Al Noor Legal
  • Souk Lane
Logo strip11 lines
HTML
<div class="stack" style="--stack:20px">
  <p class="cl-kicker" id="logos-label">UAE teams we've built links for</p>
  <ul class="logo-strip cl-logo-grid" role="list" aria-labelledby="logos-label">
    <li class="logo-strip__item ph"><svg class="i" aria-hidden="true"><use href="#i-home"/></svg>Marina Crest</li>
    <li class="logo-strip__item ph"><svg class="i" aria-hidden="true"><use href="#i-pulse"/></svg>Oasis Clinics</li>
    <li class="logo-strip__item ph"><svg class="i" aria-hidden="true"><use href="#i-truck"/></svg>Falcon Freight</li>
    <li class="logo-strip__item ph"><svg class="i" aria-hidden="true"><use href="#i-bank"/></svg>Dune Capital</li>
    <li class="logo-strip__item ph"><svg class="i" aria-hidden="true"><use href="#i-scale"/></svg>Al Noor Legal</li>
    <li class="logo-strip__item ph"><svg class="i" aria-hidden="true"><use href="#i-cart"/></svg>Souk Lane</li>
  </ul>
</div>

When to use

Under the hero or above results. Six marks, grey and equal weight, with a label that says what the logos mean. .cl-logo-grid steps from three columns to two to one, so a mark never sits alone on a row; the flex .logo-strip leaves one behind at some widths.

CRO rule

Only real clients who agreed to be shown. Never a carousel: hidden logos prove nothing. Fictional placeholders stay in .ph until replaced.

Ledger stats

.ledger--cols.stat__value.stat__label
Live · Proof sectionon --paper
1,840

Editorial links placed, Nov 2025 – Oct 2026

+164%

Median organic traffic growth at month 6

DR 52

Median Domain Rating of 2026 placements

48 h

Audit turnaround, Mon–Fri

Ledger6 lines
HTML
<div class="ledger" style="--cols:4">
  <div><div class="stat__value"><span class="ph">1,840</span></div><p class="stat__label">Editorial links placed, <span class="ph">Nov&nbsp;2025&nbsp;– Oct&nbsp;2026</span></p></div>
  <div><div class="stat__value"><span class="ph">+164%</span></div><p class="stat__label">Median organic traffic growth at month <span class="ph">6</span></p></div>
  <div><div class="stat__value"><span class="ph">DR&nbsp;52</span></div><p class="stat__label">Median Domain Rating of <span class="ph">2026</span> placements</p></div>
  <div><div class="stat__value">48&nbsp;h</div><p class="stat__label">Audit turnaround, Mon–Fri</p></div>
</div>

When to use

Two to four numbers in a hairline row, in place of a grid of stat cards. Set the column count with --cols; it drops to two columns below 760px, so use two or four.

CRO rule

Every metric carries a timeframe or a condition. Numbers render at rest: no count-up animation, nothing that ever shows 0.

Placement cards and metric pills

.placement.metric.live-dot
Live · Beside claims about site qualityon --mist
UAE business news site DR 71Traffic 480K/modofollow Live Anchor off-plan villas dubai
Expat lifestyle magazine DR 58Traffic 210K/modofollow Pending Anchor family communities dubai
DR 62 Traffic 210K/mo Referring domains +38 in 90 days
Placement card and metrics23 lines
HTML
<div class="stack" style="--stack:24px">
  <div class="grid grid-2" style="--grid-gap:16px">
    <div class="placement">
      <span class="placement__fav" aria-hidden="true">BN</span>
      <span class="placement__domain">UAE business news site</span>
      <span class="placement__meta"><span>DR <b class="ph">71</b></span><span>Traffic <b class="ph">480K</b>/mo</span><span>dofollow</span></span>
      <span class="placement__status"><span class="badge badge--brand"><span class="live-dot" aria-hidden="true"></span>Live</span></span>
      <span class="placement__anchor">Anchor <code class="ph">off-plan villas dubai</code></span>
    </div>
    <div class="placement">
      <span class="placement__fav" aria-hidden="true">EX</span>
      <span class="placement__domain">Expat lifestyle magazine</span>
      <span class="placement__meta"><span>DR <b class="ph">58</b></span><span>Traffic <b class="ph">210K</b>/mo</span><span>dofollow</span></span>
      <span class="placement__status"><span class="badge badge--warn"><span class="dot"></span>Pending</span></span>
      <span class="placement__anchor">Anchor <code class="ph">family communities dubai</code></span>
    </div>
  </div>
  <div class="cluster" style="--cluster:28px">
    <span class="metric">DR <b class="ph">62</b></span>
    <span class="metric">Traffic <b class="ph">210K</b>/mo</span>
    <span class="metric">Referring domains <b class="ph">+38</b> in <span class="ph">90 days</span></span>
  </div>
</div>

When to use

The signature visual. Use it wherever we claim "real sites with real traffic": heroes, service pages, industry pages with examples from that industry. Give each card about 340px; in a narrower column stack the cards, or the domain line truncates.

CRO rule

Describe the site's category, never a real publication name. DR, traffic and the anchor sit on the card; the Live badge is the only emerald on it.

Testimonial and case-study card

.quoteProposed.cl-case
Live · Testimonialon --paper

We'd bought links from two marketplaces before. Plenty of DR, no movement. In five months we went from zero to 14 page-one keywords for off-plan searches, and I approved every single site before anyone pitched it.

Head of MarketingDubai off-plan developer
Testimonial8 lines
HTML
<figure class="quote">
  <svg class="i cl-quote-mark" aria-hidden="true"><use href="#i-quote"/></svg>
  <blockquote class="quote__text"><p class="ph">We'd bought links from two marketplaces before. Plenty of DR, no movement. In five months we went from zero to 14 page-one keywords for off-plan searches, and I approved every single site before anyone pitched it.</p></blockquote>
  <figcaption class="quote__who">
    <span class="quote__avatar ph" aria-hidden="true">LM</span>
    <div><strong class="ph">Head of Marketing</strong><span class="ph">Dubai off-plan developer</span></div>
  </figcaption>
</figure>
Live · Case studyon --mist
Case-study card21 lines
HTML
<a class="card card--link cl-case" href="/industries/real-estate/">
  <span class="eyebrow">Case study · Real estate</span>
  <span class="h4"><span class="ph">Dubai off-plan developer</span>: <span class="ph">0 to 14</span> page-one keywords</span>
  <span class="cl-case__k">Referring domains, <span class="ph">64</span>&nbsp;to&nbsp;<span class="ph">106</span></span>
  <svg class="cl-case__chart" viewBox="0 0 300 101" role="img" aria-label="Referring domains by month, drawn to scale from zero: 64 at the start, then 70, 79, 87, 97 and 106 at month 5">
    <line class="cl-case__axis" x1="0" y1="100" x2="300" y2="100"/>
    <rect x="5" y="40.8" width="40" height="59.2"/>
    <rect x="55" y="35.3" width="40" height="64.7"/>
    <rect x="105" y="27" width="40" height="73"/>
    <rect x="155" y="19.6" width="40" height="80.4"/>
    <rect x="205" y="10.3" width="40" height="89.7"/>
    <rect class="is-now" x="255" y="2" width="40" height="98"/>
  </svg>
  <span class="cl-case__months" aria-hidden="true"><span>Start</span><span>M1</span><span>M2</span><span>M3</span><span>M4</span><span>M5</span></span>
  <dl class="cl-case__stats">
    <div><dt>Links built</dt><dd class="ph">38</dd></div>
    <div><dt>Months</dt><dd class="ph">5</dd></div>
    <div><dt>Traffic</dt><dd class="ph">+212%</dd></div>
  </dl>
  <span class="link-arrow">Read the case study<svg class="i" aria-hidden="true"><use href="#i-arrow"/></svg></span>
</a>

When to use

A quote next to the claim it backs, attributed by role and company type. Case-study cards in results sections and at the end of industry pages, three at most per row.

CRO rule

Case numbers are links built, months, keywords on page one and traffic change. Charts start at zero and are drawn to scale; only the current bar gets emerald.

Guarantee badge

Proposed.cl-guarantee.cl-guarantee--pill
Live · Under pricing, beside the final CTAon --paper

12-month replacement guarantee

If a link we placed is removed or turns nofollow within 12 months, we replace it at no cost.

12-month replacement guarantee
Guarantee badge10 lines
HTML
<div class="cluster cl-guarantees" style="--cluster:24px 32px">
  <div class="cl-guarantee">
    <span class="cl-guarantee__seal" aria-hidden="true"><svg class="i"><use href="#i-shield"/></svg></span>
    <div>
      <p class="cl-guarantee__t">12-month replacement guarantee</p>
      <p class="cl-guarantee__d">If a link we placed is removed or turns nofollow within 12&nbsp;months, we replace it at no cost.</p>
    </div>
  </div>
  <span class="cl-guarantee--pill"><svg class="i" aria-hidden="true"><use href="#i-shield"/></svg>12-month replacement guarantee</span>
</div>

When to use

The full badge under pricing and on contact. The pill beside a button where space is tight. Link both to /legal/terms/#replacement.

CRO rule

Risk reversal belongs near the price and the final ask. Guarantee the process (replacement, approval, month to month), never rankings.

Forms

Short forms that qualify gently

Every input has a visible label. Errors say what to type. Forms submit through JS with preventDefault; domain forms use data-domain-form and site.js.

Fields and error state

.field.input.select.textarea[aria-invalid].error
Live · Contact form fieldson --paper
Your strategist replies from their own address.
Best fit for UAE businesses spending AED 5,000+ a month on growth.

Enter your website address, for example yourcompany.ae

Fields31 lines
HTML
<form class="grid grid-2" style="--grid-gap:20px 24px" novalidate data-cl-static>
  <div class="field">
    <label for="f-name">Your name</label>
    <input class="input" id="f-name" name="name" autocomplete="name" placeholder="First and last name">
  </div>
  <div class="field">
    <label for="f-email">Work email</label>
    <input class="input" id="f-email" name="email" type="email" autocomplete="email" placeholder="you@company.ae" aria-describedby="f-email-hint">
    <span class="hint" id="f-email-hint">Your strategist replies from their own address.</span>
  </div>
  <div class="field">
    <label for="f-budget">Monthly growth budget</label>
    <select class="select" id="f-budget" name="budget" aria-describedby="f-budget-hint">
      <option value="">Select a range in AED</option>
      <option>Under AED 5,000</option>
      <option>AED 5,000–10,000</option>
      <option>AED 10,000–25,000</option>
      <option>AED 25,000+</option>
    </select>
    <span class="hint" id="f-budget-hint">Best fit for UAE businesses spending AED <span class="ph">5,000+</span> a month on growth.</span>
  </div>
  <div class="field">
    <label for="f-site">Website</label>
    <input class="input" id="f-site" name="site" value="mycompany" aria-invalid="true" aria-describedby="f-site-error">
    <p class="error" id="f-site-error">Enter your website address, for example yourcompany.ae</p>
  </div>
  <div class="field" style="grid-column:1 / -1">
    <label for="f-notes">Anything we should know? <span class="subtle">(optional)</span></label>
    <textarea class="textarea" id="f-notes" name="notes" placeholder="Target markets, past link building, an Arabic site, deadlines"></textarea>
  </div>
</form>

When to use

Contact and audit forms. Point aria-describedby at hints and errors. Set aria-invalid="true" only after a submit attempt, and clear it as soon as the value is fixed.

CRO rule

Qualify with the budget select in AED and the "best fit" hint; never with a wall of required fields. Optional fields say so.

Option grid and progress

.option-grid.option.tick.steps-progressProposed.cl-fieldset
Live · Step one of a formon --paper
What do you need most?
Option grid12 lines
HTML
<div class="stack" style="--stack:24px">
  <div class="steps-progress" role="progressbar" aria-label="Form progress" aria-valuemin="1" aria-valuemax="3" aria-valuenow="1"><span class="is-done"></span><span></span><span></span></div>
  <fieldset class="cl-fieldset">
    <legend class="label">What do you need most?</legend>
    <div class="option-grid">
      <label class="option"><input type="radio" name="need-demo" value="guest-posts" checked><span class="tick" aria-hidden="true"></span>Editorial guest posts</label>
      <label class="option"><input type="radio" name="need-demo" value="niche-edits"><span class="tick" aria-hidden="true"></span>Niche edits</label>
      <label class="option"><input type="radio" name="need-demo" value="digital-pr"><span class="tick" aria-hidden="true"></span>Digital PR</label>
      <label class="option"><input type="radio" name="need-demo" value="arabic"><span class="tick" aria-hidden="true"></span>Arabic link building</label>
    </div>
  </fieldset>
</div>

Two-step audit form

.card.steps-progress[data-prefill-domain]

A working demo. The easy question comes first; contact details come second, once someone has invested a click. Try leaving fields empty.

Live · Contact pageon --mist
Free link gap audit Step 1 of 2
Which site should we audit?
What matters most right now?
Two-step form55 lines
HTML
<form class="card card--raised cl-twostep" novalidate data-cl-twostep>
  <div class="cl-twostep__top">
    <span class="eyebrow">Free link gap audit</span>
    <span class="mono xsmall subtle" data-cl-step-label aria-live="polite">Step 1 of 2</span>
  </div>
  <div class="steps-progress" aria-hidden="true"><span class="is-done"></span><span></span></div>

  <fieldset class="cl-fieldset stack" style="--stack:18px" data-step="1">
    <legend class="h4">Which site should we audit?</legend>
    <div class="field">
      <label for="ts-site">Website</label>
      <input class="input" id="ts-site" name="site" inputmode="url" autocomplete="url" placeholder="yourcompany.ae" data-prefill-domain aria-describedby="ts-site-error">
      <p class="error" id="ts-site-error" hidden></p>
    </div>
    <fieldset class="cl-fieldset">
      <legend class="label">What matters most right now?</legend>
      <div class="option-grid">
        <label class="option"><input type="radio" name="ts-goal" value="rankings" checked><span class="tick" aria-hidden="true"></span>UAE rankings</label>
        <label class="option"><input type="radio" name="ts-goal" value="arabic"><span class="tick" aria-hidden="true"></span>Arabic search</label>
      </div>
    </fieldset>
    <button class="btn btn--primary btn--block" type="submit">Continue<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></button>
  </fieldset>

  <fieldset class="cl-fieldset stack" style="--stack:18px" data-step="2" hidden>
    <legend class="h4">Where should we send it?</legend>
    <div class="field">
      <label for="ts-email">Work email</label>
      <input class="input" id="ts-email" name="email" type="email" autocomplete="email" placeholder="you@company.ae" aria-describedby="ts-email-error">
      <p class="error" id="ts-email-error" hidden></p>
    </div>
    <div class="field">
      <label for="ts-budget">Monthly growth budget</label>
      <select class="select" id="ts-budget" name="budget">
        <option value="">Select a range in AED</option>
        <option>Under AED 5,000</option>
        <option>AED 5,000–10,000</option>
        <option>AED 10,000–25,000</option>
        <option>AED 25,000+</option>
      </select>
    </div>
    <div class="cl-twostep__actions">
      <button class="btn btn--ghost" type="button" data-cl-back><svg class="i" aria-hidden="true"><use href="#i-arrow-left"/></svg>Back</button>
      <button class="btn btn--primary" type="submit">Get my free audit<svg class="i i-arrow" aria-hidden="true"><use href="#i-arrow"/></svg></button>
    </div>
    <p class="btn-note">Delivered in 48 hours · No lock-in · 12-month replacement guarantee</p>
  </fieldset>

  <div class="stack" style="--stack:12px" data-step="done" hidden tabindex="-1">
    <span class="icon-tile"><svg class="i" aria-hidden="true"><use href="#i-check"/></svg></span>
    <p class="h4">Your audit is in the queue.</p>
    <p class="small muted"><span class="ph">Rania</span> will send your link gap report within 48 hours, Mon–Fri. Replies come from a person, not a sequence.</p>
    <button class="btn btn--ghost" type="button" data-cl-reset><svg class="i" aria-hidden="true"><use href="#i-refresh"/></svg>Run the demo again</button>
  </div>
</form>
Content

Navigation aids, objections and articles

The quiet components that make long pages readable: where you are, what it costs you to say no, how the work runs, and what to read next.

Breadcrumbs, badges and chips

.breadcrumbs.badge.badge--brand.badge--dark.badge--warn.chip
Live · Page tops, cards, filterson --paper

Breadcrumbs

Badges

Dofollow Free · 48-hour turnaround Live Most chosen Awaiting approval

Chips

Breadcrumbs, badges, chips18 lines
HTML
<nav class="breadcrumbs" aria-label="Breadcrumb">
  <ol>
    <li><a href="/">Home</a></li>
    <li><a href="/industries/">Industries</a></li>
    <li><span aria-current="page">Real estate</span></li>
  </ol>
</nav>

<span class="badge">Dofollow</span>
<span class="badge badge--brand"><span class="dot"></span>Free · 48-hour turnaround</span>
<span class="badge badge--brand"><span class="live-dot" aria-hidden="true"></span>Live</span>
<span class="badge badge--dark">Most chosen</span>
<span class="badge badge--warn"><span class="dot"></span>Awaiting approval</span>

<div class="cluster" style="--cluster:8px">
  <a class="chip" href="/blog/digital-pr/">Guides</a>
  <a class="chip is-active" href="/blog/digital-pr/" aria-current="page">Arabic SEO</a>
</div>

When to use

Breadcrumbs on every page below home. .badge--brand for free offers and live states, .badge--dark for "Most chosen", .badge--warn for pending states. Chips filter lists (blog categories, industries).

CRO rule

One emerald badge per card at most, and only when it means free or live. The current chip uses aria-current="page" when it's a link.

FAQ accordion

.faqdetails / summary.pm.faq__a
Live · Before the footeron --paper
How much does link building cost?

Packages start at AED 5,900 a month for 5 links, about AED 1,180 per link. Prices are in AED, excluding 5% VAT, and the free audit tells you which package fits before you spend anything.

Do I have to sign a long contract?

No. Campaigns run month to month. Give 30 days' notice and we stop; links already placed stay live.

Can these links get my site penalised?

Links from PBNs and link farms can. We don't use them. Every site we propose has real organic traffic and publishes for its own readers. If a placed link disappears within 12 months, we replace it.

Do I approve the sites before outreach?

Yes, every one. You get the site list with DR, traffic and a sample page for each. Reject any site, no reason needed. Nothing is pitched until you sign off.

How soon do links go live?

The audit arrives within 48 hours. Once you approve the site list, the first placements usually go live between day 7 and day 30, depending on each editor's schedule.

How do you report on progress?

A live dashboard shows every link with its DR, traffic, anchor and live status. You also get a monthly report on referring domains and rankings for your target pages.

Can you build links on Arabic sites?

Yes. Native Arabic speakers run outreach to MENA publishers, and anchors are written in Arabic when the target page is Arabic.

Will you guarantee first-page rankings?

No one honestly can. We guarantee the process: sites you approve, links that stay live, transparent reporting and replacements for 12 months.

FAQ34 lines
HTML
<div class="faq">
  <details open>
    <summary>How much does link building cost?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>Packages start at AED <span class="ph">5,900</span> a month for <span class="ph">5</span> links, about AED <span class="ph">1,180</span> per link. Prices are in AED, excluding 5% VAT, and the free audit tells you which package fits before you spend anything.</p></div>
  </details>
  <details>
    <summary>Do I have to sign a long contract?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>No. Campaigns run month to month. Give <span class="ph">30 days'</span> notice and we stop; links already placed stay live.</p></div>
  </details>
  <details>
    <summary>Can these links get my site penalised?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>Links from PBNs and link farms can. We don't use them. Every site we propose has real organic traffic and publishes for its own readers. If a placed link disappears within 12 months, we replace it.</p></div>
  </details>
  <details>
    <summary>Do I approve the sites before outreach?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>Yes, every one. You get the site list with DR, traffic and a sample page for each. Reject any site, no reason needed. Nothing is pitched until you sign off.</p></div>
  </details>
  <details>
    <summary>How soon do links go live?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>The audit arrives within 48 hours. Once you approve the site list, the first placements usually go live between day <span class="ph">7</span> and day <span class="ph">30</span>, depending on each editor's schedule.</p></div>
  </details>
  <details>
    <summary>How do you report on progress?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>A live dashboard shows every link with its DR, traffic, anchor and live status. You also get a monthly report on referring domains and rankings for your target pages.</p></div>
  </details>
  <details>
    <summary>Can you build links on Arabic sites?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>Yes. Native Arabic speakers run outreach to MENA publishers, and anchors are written in Arabic when the target page is Arabic.</p></div>
  </details>
  <details>
    <summary>Will you guarantee first-page rankings?<span class="pm" aria-hidden="true"></span></summary>
    <div class="faq__a"><p>No one honestly can. We guarantee the process: sites you approve, links that stay live, transparent reporting and replacements for 12 months.</p></div>
  </details>
</div>

When to use

On every selling page, near the end. Five to eight questions. Open the first one so the pattern reads as an accordion.

CRO rule

The FAQ handles objections: price, contract length, Google penalties, approval, timelines, reporting, Arabic sites. Industry pages add their own regulator questions (DLD/RERA, DHA).

Comparison table

.table-wrap.compare.is-us.yes / .noProposed.cl-cmp
Live · Scrolls inside .table-wrap when narrowon --paper
What you getLinkBuildingServices.aeTypical link sellerIn-house outreach
You approve every site firstAlwaysRarelyYes
Sites vetted for real organic trafficEvery siteVariesDepends on tools
Prices in AED, shown openlyYesQuote onlySalary plus tools
12-month replacement guaranteeYesRarelyNo
English and Arabic outreachBothEnglish onlyDepends on hires
Comparison table14 lines
HTML
<div class="table-wrap" tabindex="0" role="region" aria-label="Comparison table, scrolls sideways on phones">
  <table class="compare">
    <thead>
      <tr><th scope="col">What you get</th><th scope="col" class="is-us">LinkBuilding<wbr>Services.ae</th><th scope="col">Typical link seller</th><th scope="col">In-house outreach</th></tr>
    </thead>
    <tbody>
      <tr><th scope="row">You approve every site first</th><td class="is-us"><span class="cl-cmp"><svg class="i yes" aria-hidden="true"><use href="#i-check"/></svg><span>Always</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-x"/></svg><span>Rarely</span></span></td><td><span class="cl-cmp"><svg class="i yes" aria-hidden="true"><use href="#i-check"/></svg><span>Yes</span></span></td></tr>
      <tr><th scope="row">Sites vetted for real organic traffic</th><td class="is-us"><span class="cl-cmp"><svg class="i yes" aria-hidden="true"><use href="#i-check"/></svg><span>Every site</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-minus"/></svg><span>Varies</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-minus"/></svg><span>Depends on tools</span></span></td></tr>
      <tr><th scope="row">Prices in AED, shown openly</th><td class="is-us"><span class="cl-cmp"><svg class="i yes" aria-hidden="true"><use href="#i-check"/></svg><span>Yes</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-x"/></svg><span>Quote only</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-minus"/></svg><span>Salary plus tools</span></span></td></tr>
      <tr><th scope="row">12-month replacement guarantee</th><td class="is-us"><span class="cl-cmp"><svg class="i yes" aria-hidden="true"><use href="#i-check"/></svg><span>Yes</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-x"/></svg><span>Rarely</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-x"/></svg><span>No</span></span></td></tr>
      <tr><th scope="row">English and Arabic outreach</th><td class="is-us"><span class="cl-cmp"><svg class="i yes" aria-hidden="true"><use href="#i-check"/></svg><span>Both</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-minus"/></svg><span>English only</span></span></td><td class="no"><span class="cl-cmp"><svg class="i" aria-hidden="true"><use href="#i-minus"/></svg><span>Depends on hires</span></span></td></tr>
    </tbody>
  </table>
</div>

Process steps

.steps--steps.step.step__n.step__time
Live · How it workson --paper
  1. Step 1Day 0

    Free link gap audit

    Your backlinks mapped against your top three competitors', delivered within 48 hours.

  2. Step 2Day 2

    You approve the sites

    Each site with DR, traffic and a sample page. Nothing goes live without your OK.

  3. Step 3Day 7–30

    Outreach and placement

    English and Arabic outreach to editors. No PBNs, no link farms.

  4. Step 4Every month

    Live report

    Every link, its DR, traffic, anchor and live status in your dashboard.

Process steps6 lines
HTML
<ol class="steps" role="list" style="--steps:4">
  <li class="step"><span class="step__n">Step 1</span><span class="step__time">Day 0</span><h4>Free link gap audit</h4><p class="small muted">Your backlinks mapped against your top three competitors', delivered within 48 hours.</p></li>
  <li class="step"><span class="step__n">Step 2</span><span class="step__time">Day <span class="ph">2</span></span><h4>You approve the sites</h4><p class="small muted">Each site with DR, traffic and a sample page. Nothing goes live without your OK.</p></li>
  <li class="step"><span class="step__n">Step 3</span><span class="step__time">Day <span class="ph">7–30</span></span><h4>Outreach and placement</h4><p class="small muted">English and Arabic outreach to editors. No PBNs, no link farms.</p></li>
  <li class="step"><span class="step__n">Step 4</span><span class="step__time">Every month</span><h4>Live report</h4><p class="small muted">Every link, its DR, traffic, anchor and live status in your dashboard.</p></li>
</ol>

When to use

Only for a real sequence with real timings. Set --steps to the count (3 or 4). Below 900px it turns into a vertical timeline.

CRO rule

Put the approval step in plain sight; it's our strongest differentiator. Timings are promises, so they must match the contract.

Post cards

.post-card.post-card__media.post-card__cat
Live · Blog, related readingon --paper
Post card6 lines
HTML
<a class="post-card" href="/blog/link-building-cost-uae/">
  <div class="post-card__media" aria-hidden="true"><!-- HTML/SVG visual from the subject's world --></div>
  <div class="post-card__meta"><span class="post-card__cat">Guides</span><span class="ph">12 Nov 2026</span><span class="ph">9 min read</span></div>
  <h3 class="post-card__title">How to read a DR distribution before you buy a single link</h3>
  <p class="post-card__excerpt">A healthy UAE profile isn't all DR 70+. The spread we aim for, and why it looks natural to Google.</p>
</a>

Prose

.prose.container--narrow
Live · Articles, guides, legalon --paper

DR tells you how strong a site's link profile is. It doesn't tell you whether anyone reads it. Before a site reaches your approval list, we check the things a DR score hides, and we tag every outbound link with the right rel value.

What we check before a site reaches your list

  • Organic traffic over the last 12 months, not just today
  • Whether the site writes for readers or for link buyers
  • Topical relevance to the page you want to rank
  • Outbound links to casino, pharmacy or loan sites: a hard no

A DR 40 site with real UAE readers beats a DR 70 site that sells links to anyone.

DR bandTypical UAE priceWhat to check
DR 30–49AED 600–1,100Traffic trend, niche fit
DR 50–69AED 1,200–2,400Outbound link patterns
DR 70+AED 2,500+Whether the section is indexed
Prose21 lines
HTML
<article class="prose" aria-label="Prose sample">
  <p>DR tells you how strong a site's link profile is. It doesn't tell you whether anyone reads it. Before a site reaches your approval list, we check the things a <a href="/blog/link-building-cost-uae/">DR score hides</a>, and we tag every outbound link with the right <code>rel</code> value.</p>
  <h3>What we check before a site reaches your list</h3>
  <ul>
    <li>Organic traffic over the last 12 months, not just today</li>
    <li>Whether the site writes for readers or for link buyers</li>
    <li>Topical relevance to the page you want to rank</li>
    <li>Outbound links to casino, pharmacy or loan sites: a hard no</li>
  </ul>
  <blockquote><p>A DR 40 site with real UAE readers beats a DR 70 site that sells links to anyone.</p></blockquote>
  <div class="table-wrap">
    <table>
      <thead><tr><th>DR band</th><th>Typical UAE price</th><th>What to check</th></tr></thead>
      <tbody>
        <tr><td>DR 30–49</td><td class="num ph">AED 600–1,100</td><td>Traffic trend, niche fit</td></tr>
        <tr><td>DR 50–69</td><td class="num ph">AED 1,200–2,400</td><td>Outbound link patterns</td></tr>
        <tr><td>DR 70+</td><td class="num ph">AED 2,500+</td><td>Whether the section is indexed</td></tr>
      </tbody>
    </table>
  </div>
</article>
Do and don't

The rules, side by side

Conversion and visual rules that reviews keep catching. Each pair shows the same idea done right and done wrong.

Get my free audit

DoRepeat one verb on every primary button.

Request a quoteGet started

Don'tInvent new primary wording per section.

Links on sites with real UAE trafficDR 58Traffic 210K/mo

DoPut proof right next to the claim.

Trusted by thousands of businesses worldwideNo source, no number, no timeframe

Don'tMake claims the screen can't back up.

1,840Editorial links placed, Nov 2025 – Oct 2026

DoShow numbers at rest, with a timeframe.

0+17 people are viewing this page

Don'tAdd count-up counters or fake activity.

AED10,900/ month · excl. 5% VAT

DoPrice in AED, openly, with the VAT note.

Contact us for pricingor a price in USD with no VAT note

Don'tHide prices. It's our edge over UAE competitors.

DoKeep emerald for the action only.

Don'tUse emerald for decoration or big fills.

12-month replacement guarantee

DoPromise the process: approval, live links, replacements.

#1 on Google in 30 days, guaranteed

Don'tGuarantee rankings. It's a cheap signal and a legal risk.

Also, on every page

  • No gradient washes, glass blobs or emoji.
  • No all-caps headings, weights above 700 or extra fonts.
  • No card around every section; prefer hairline ledgers.
  • No "01 / 02 / 03" on things that aren't a sequence.
  • No CTA band directly above the footer CTA.
  • No countdown timers or carousels that hide proof.

Proposed for site.css

Proposed

Built on this page in components.css because the system doesn't have them yet. Promote them, rename them without the cl- prefix, then use them anywhere.

ClassComponentWhy it's needed
.cl-reviewReview badge on light grounds.footer-badge only works on ink.
.cl-guaranteeGuarantee badge and pillRisk reversal is a rule, but there's no component for it.
.cl-caseCase-study card with a to-scale chartResults pages and industry pages both need it.
.cl-call, .cl-avatarBook-a-call card, strategist avatar.quote__avatar is 44px and tied to testimonials.
.cl-magnetLead-magnet card with a coverThe price guide appears on several pages.
.cl-fieldsetFieldset resetRadio groups need a fieldset and legend; site.css doesn't reset them.
.cl-logo-gridLogo strip on a gridThe flex .logo-strip leaves one mark alone on a row at some widths, and its grey (#8A948F) is 3.1:1 on paper. The grid version uses --text-3 (4.9:1). home.css solves the rows locally with .home-logos__list.
.cl-price-gridPrice cards on shared row tracksNames, prices, DR mix, lists and buttons line up across tiers whatever wraps. home.css does the same inside .home-pricing__grid.
.cl-drmixDR mix line on a price cardLink count, then each DR band as one unit that never breaks mid-range. home.css has .home-drmix.
.cl-cmpComparison table cellKeeps the tick and its label on one line and wraps the label beside the icon. home.css has the same idea as .home-cmp.