This specification defines the metadata, content structure, local-business information, SEO signals, image requirements and PWA information used to generate a production-quality public business website.
Choose a stable business name and a permanent public slug.
Provide a clear business description, location, contact information and services.
Add authentic business images with meaningful alternative text.
Test structured data, live rendering, canonical URL, crawlability and PWA assets before publication.
Required by this platform's data contract or required to create a reliable local-business page.
Strongly recommended because it improves completeness, user trust, discoverability or structured data quality.
Use when the information genuinely exists and can be maintained accurately.
Put the machine-readable business metadata in one hidden element:
#business-data.
The rendering engine reads these values and generates the public page,
SEO metadata, LocalBusiness structured data and PWA resources.
<div
id="business-data"
hidden
data-name="Business Name"
data-short_name="Business"
data-description="A concise, accurate description of the business."
data-phone="+8801XXXXXXXXX"
data-whatsapp="+8801XXXXXXXXX"
data-email="hello@example.com"
data-address="Full street address"
data-city="City"
data-region="Region"
data-country="BD"
data-postal_code="0000"
data-category="LocalBusiness"
data-latitude="00.00000"
data-longitude="00.00000"
data-theme="#C0202A"
data-background="#FAFAFA"
data-seo_title="Business Name | Primary Service | City"
data-pwa="true"
data-lang="bn"
></div>
| Field | Required | Purpose | Rules | Example |
|---|---|---|---|---|
data-name |
* | Official business name | Use the real public-facing name. Keep spelling consistent with the business's real-world identity. | PointIT |
data-short_name |
* | PWA short name | Keep it compact enough for installed-app UI. Do not use a misleading abbreviation. | PointIT |
data-description |
* | Business summary | Describe what the business actually does, ideally including its primary service and locality naturally. | Computer and PTE training center in Moulvibazar. |
data-address |
* | Physical street address | Must identify the actual physical location. | 2nd floor, TC Market, Court Rd |
data-city |
* | Locality / city | Use the locality users would normally use when searching for the business. | Moulvibazar |
data-country |
* | Country | Prefer a standard country code. | BD |
data-category |
* | Schema.org business type |
Use the most accurate LocalBusiness subtype when one genuinely applies.
Otherwise use LocalBusiness.
|
LocalBusiness |
data-latitude |
* | Physical latitude | Use real coordinates. Keep at least 5 decimal places. | 24.49212 |
data-longitude |
* | Physical longitude | Use real coordinates. Keep at least 5 decimal places. | 91.77446 |
data-theme |
* | Brand/UI theme color | Valid CSS color. Prefer a stable brand color. | #C0202A |
data-background |
* | PWA background color | Valid CSS color. Should work well as a launch/splash background. | #FAFAFA |
data-seo_title |
* | Preferred SEO title | Unique, descriptive and concise. Do not stuff locations or keywords. | PointIT | Computer Training Center | Moulvibazar |
data-pwa |
* | Enable PWA generation |
Use true for an installable business web application.
|
true |
data-lang |
* | Primary page language | Use a valid language code. | bn |
| Field | Status | Why it matters |
|---|---|---|
data-phone |
Recommended | Primary customer contact number. Use international format where possible. |
data-whatsapp |
Recommended | Direct messaging contact for customer conversion. |
data-email |
Recommended | Primary business email. |
data-region |
Recommended | State / division / province equivalent where applicable. |
data-postal_code |
Recommended | Postal or ZIP code when the business has one. |
Images should represent the business or the content they are attached to.
Use sharp, high-quality files and place images near relevant text.
Meaningful alt text should describe the image in context.
First meaningful business image on the page. This image is also suitable for the generated social preview and primary business structured-data image.
Exterior, entrance, building, signboard or other genuine location evidence.
Show the real service, product, facility or customer-facing experience.
alt attributes.
alt text.
The public URL should be the canonical URL of the business page:
https://w.pointit.org/{business-slug}
The renderer should generate the canonical link automatically from the public route instead of requiring authors to paste canonical HTML into the content.
Recommended format:
{Business Name} | {Primary Service} | {City}
Keep it readable and unique. Avoid repetitive city names or keyword chains.
Write a natural summary that tells a potential visitor what the business provides and where it operates.
{Business} provides {primary services}
in {city}, serving {audience}.
<a href="..."> elements.
LocalBusiness subtype that actually applies.
Never choose a subtype purely for SEO.
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Business Name",
"address": {
"@type": "PostalAddress",
"streetAddress": "Full street address",
"addressLocality": "City",
"addressRegion": "Region",
"postalCode": "Postal code",
"addressCountry": "BD"
}
}
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://w.pointit.org/business-slug#business",
"name": "Business Name",
"url": "https://w.pointit.org/business-slug",
"description": "Accurate business description.",
"image": [
"https://imgur.com/XXX",
"https://imgur.com/XXX",
"https://imgur.com/XXX"
],
"telephone": "+8801XXXXXXXXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "Full street address",
"addressLocality": "City",
"addressRegion": "Region",
"postalCode": "0000",
"addressCountry": "BD"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 24.49212,
"longitude": 91.77446
},
"sameAs": [
"https://www.facebook.com/example",
"https://www.instagram.com/example"
]
}
| Structured-data property | Status | Source | Notes |
|---|---|---|---|
name |
* | data-name |
Official business name. |
address |
* | Address fields | Physical business location. Include as many accurate address components as available. |
geo |
Recommended | Latitude + longitude | Use real geographic coordinates. Keep at least five decimal places. |
telephone |
Recommended | data-phone |
Primary customer contact number. |
url |
Recommended | Generated public route | The canonical business page URL. |
image |
Recommended | Business images | Images should represent the business. |
openingHoursSpecification |
Recommended | Business hours | Use only when the hours are accurate and maintained. |
priceRange |
Optional | Business information | Use only when meaningful for the business. |
sameAs |
Recommended | Verified social / identity URLs | Only include official profiles that unambiguously represent the business. |
data-address="Full street address"
data-city="City"
data-country="BD"
data-address="Full street address"
data-city="City"
data-region="Region"
data-postal_code="0000"
data-country="BD"
data-latitude="24.49212"
data-longitude="91.77446"
Recommended: storefront, entrance, building frontage, signboard or another authentic visual cue that helps people identify the real-world location.
| Field | Status | Example |
|---|---|---|
data-phone |
Recommended | +8801887799196 |
data-whatsapp |
Recommended | +8801887799196 |
data-email |
Recommended | hello@example.com |
The visible page should also contain usable contact links:
<a href="tel:+8801887799196">
Call the business
</a>
<a href="https://wa.me/8801887799196">
WhatsApp
</a>
<a href="mailto:hello@example.com">
Email
</a>
Opening hours should be published only when they are maintained accurately. For future renderer support, use a structured internal representation rather than placing free-form hours inside unrelated text.
data-opening_hours='[
{
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"dayOfWeek": ["Saturday"],
"opens": "10:00",
"closes": "16:00"
}
]'
This field is part of the target platform contract and may require renderer support in the next index.js revision.
Future renderer versions should support a structured list of official identity URLs. Only include profiles that genuinely represent the same business.
data-same_as='[
"https://www.facebook.com/example",
"https://www.instagram.com/example",
"https://www.linkedin.com/company/example"
]'
Metadata alone does not create a useful business page. The visible page should clearly explain the business to people first.
Every business page marked with data-pwa="true" should receive
a business-specific web app manifest, icons and application metadata.
| Data | Status | Manifest destination |
|---|---|---|
data-name |
* | name |
data-short_name |
* | short_name |
data-background |
* | background_color |
data-theme |
* | theme_color |
data-pwa |
* | Feature switch |
| Business slug | * | id / start_url |
| 192×192 icon | * | icons[] |
| 512×512 icon | * | icons[] |
{
"id": "/business-slug",
"name": "Business Name",
"short_name": "Business",
"description": "Accurate business description.",
"start_url": "/business-slug",
"scope": "/business-slug/",
"display": "standalone",
"background_color": "#FAFAFA",
"theme_color": "#C0202A",
"icons": [
{
"src": "/business-slug/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/business-slug/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
id or start_url after installation.
Square PNG. Keep the important logo/mark inside the safe area.
High-resolution square PNG for installation and larger contexts.
The service worker should be lightweight and should never block primary page rendering. Its purpose is to provide appropriate application resilience, controlled caching and offline behavior where implemented.
/business-slug/sw.js
Compress images, use modern formats when practical, specify dimensions and lazy-load below-the-fold imagery.
Avoid large duplicate style blocks. Reuse shared styles and keep page-specific CSS close to the page when required.
Essential business content must not depend on JavaScript execution. Keep optional enhancements small.
Public business pages should be reachable by ordinary links, should not require authentication, and should be allowed to be crawled and indexed unless a deliberate business-owner decision says otherwise.
noindexA valid business slug should resolve only to its own business page. Invalid, malformed or unknown routes should not accidentally display another business.
/ → application root
/register → registration/information page
/error → public error page
/{business-slug} → business page
/{business-slug}/manifest.webmanifest
/{business-slug}/sw.js
/{business-slug}/icon-192.png
/{business-slug}/icon-512.png
Test the live business URL and inspect detected structured data.
Inspect the page in the site's Search Console property and run a live test.
Confirm indexing eligibility, canonical selection, structured data and loaded resources after changes.
The public business-page renderer should own technical metadata rather than requiring business-page authors to duplicate it.
<title>These fields are intentionally documented now so the rendering engine can be expanded without changing the page-authoring model later.
| Field | Status | Purpose |
|---|---|---|
data-logo |
Recommended | Official business logo URL. |
data-hero_image |
Recommended | Explicit social/hero image instead of relying on first image. |
data-same_as |
Recommended | Official identity URLs. |
data-opening_hours |
Recommended | Structured weekly opening schedule. |
data-price_range |
Optional | Relative price range where meaningful. |
data-map_url |
Optional | Business-controlled map or location URL. |
data-area_served |
Optional | Locations or regions genuinely served. |
data-keywords |
Optional | Internal categorization only. Never use it as hidden keyword stuffing. |
web-pages.SKILLThe following compact specification is intended to be copied as plaintext and supplied to an AI agent that is generating or editing a business page.