Valiterm Starter Kit
This page shows live Valiterm scripts users can copy. English is the default, Messages in another language are included as an optional second language and act as a placeholder that can be customized to your local language.
OpeningHours & Business Profile
STORE — visitor address (walk-ins)
{
"@context": "https://schema.org",
"@type": ["Organization","LocalBusiness"],
"@id": "https://example.com/#org",
"name": "Company Name",
"url": "https://example.com",
"telephone": "+46-00-000000",
"email": "[email protected]",
"publicAccess": true,
"address": {
"@type": "PostalAddress",
"streetAddress": "Street 1",
"postalCode": "123 45",
"addressLocality": "City",
"addressCountry": "SE"
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "16:00"
}],
"areaServed": ["SE"],
"serviceArea": ["SE"]
}
SERVICE_AREA — you go to the customer (no public visitor address)
{
"@context": "https://schema.org",
"@type": ["Organization","LocalBusiness"],
"@id": "https://example.com/#org",
"name": "Company Name",
"url": "https://example.com",
"telephone": "+46-00-000000",
"email": "[email protected]",
"publicAccess": false,
"address": {
"@type": "PostalAddress",
"streetAddress": "Registered Street 1",
"postalCode": "123 45",
"addressLocality": "City",
"addressCountry": "SE"
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "16:00"
}],
"areaServed": ["SE"],
"serviceArea": ["SE-GBG"]
}
ONLINE_ONLY — no public visitor address (consulting/SaaS)
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#org",
"name": "Company Name",
"url": "https://example.com",
"telephone": "+46-00-000000",
"email": "[email protected]",
"publicAccess": false,
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "16:00"
}],
"areaServed": "Global"
}
Service capacity & appointment windows
Use this when you don’t ship goods. Define where you serve customers, how many jobs/hours you can handle, and which time windows you offer.
Adapt to your business
How this works (5 quick steps):
- Click Show JSON on the block you want and use Copy JSON.
- Below, click Copy prompt for the matching section.
- In your AI tool: paste the prompt first, then paste the original JSON right under it.
- Fill in the
[BRACKETS]
at the top of the prompt (country, region, @id, etc.). - Submit. If the AI asks clarifying questions, answer them; then use the returned valid JSON.
AI adaptation prompt — OpeningHours + BusinessProfile + ClosurePolicy
ROLE
You are adapting three JSON blocks for my website:
A) schema.org Organization/LocalBusiness opening hours
B) Valiterm BusinessProfile
C) Valiterm ClosurePolicy
WHAT I WILL PROVIDE
- I paste the original JSON blocks from the Valiterm Starter Kit directly below this prompt.
- I also provide my business facts in brackets.
INPUTS (replace the brackets or answer questions)
- ORG_ID: [https://yourdomain.com/#org]
- MODE: [STORE | SERVICE_AREA | ONLINE_ONLY]
- COUNTRY: [SE | DE | PL | …]
- SUBREGION: [e.g., SE-GBG or null]
- PUBLIC_ACCESS: [true/false] (true only for STORE)
- AREA_SERVED: [e.g., ["SE"]]
- SERVICE_AREA: [e.g., ["SE-GBG","SE"]] or []
- TIMEZONE: [Europe/Stockholm | Europe/Copenhagen | …]
- OPEN_HOURS: [e.g., Mon–Fri 07:00–16:00]
- SUMMER_WEEKS: [[29,30,31]] or []
- HOLIDAY_CLOSE: [[ "2025-12-24", "Christmas Eve (closed)" ], …] or []
- HOLIDAY_OPEN: [[ "2025-12-26", "Open for special sales" ]] or []
RULES
1) Keep valid JSON (UTF-8, no comments). Do not invent data. Ask if unclear.
2) Reuse ORG_ID consistently. Set BusinessProfile.hoursRef and ClosurePolicy.hoursRef to ORG_ID.
3) Set BusinessProfile.mode to MODE. If MODE ≠ STORE, set PUBLIC_ACCESS=false in OpeningHours.
4) Apply country calendars in ClosurePolicy:
"useNationalCalendars": ["nationalHolidays","nationalNonWorkDays"] with jurisdiction.country=COUNTRY (and optional subregion).
5) Set opening hours to OPEN_HOURS.
6) Keep property names and @context/@type exactly as in the originals.
7) OUTPUT: return THREE JSON objects in this exact order, separated by a blank line:
1) OpeningHours (schema.org)
2) BusinessProfile (Valiterm)
3) ClosurePolicy (Valiterm)
AI adaptation prompt — ShippingMatrix + Cut-off
ROLE
You are adapting a Valiterm ShippingMatrix for my business.
WHAT I WILL PROVIDE
- I paste the original ShippingMatrix JSON from the Starter Kit below this prompt.
- I also provide my business facts in brackets.
INPUTS
- ORG_ID: [https://yourdomain.com/#org]
- TIMEZONE: [Europe/Stockholm | Europe/Copenhagen | …]
- CUTOFF_TIME: [12:00]
- SERVICES_USED: [B2C_SERVICE_POINT, B2C_HOME, B2B_PARCEL, BULKY] // keep codes; you may rename labels
- MESSAGE_EN: ["Shipping cost is shown at checkout after address and method are confirmed."]
RULES
1) Keep "@context":"https://valiterm.org", "@type":"ShippingMatrix", "@id", "logic.readiness" and "clockAnchor":"readiness.readyAt".
2) Apply TIMEZONE and CUTOFF_TIME consistently to all cutoff rules we keep.
3) If SERVICES_USED omits a service, remove it cleanly from "services" and any "appliesTo" arrays.
4) Keep "pricing.model":"deferred" and "display":"none-before-checkout".
5) Do not add parcel/service-point/home specifics beyond what is already in the original.
6) OUTPUT: return ONE JSON object (the adapted ShippingMatrix).
AI adaptation prompt — Bulky lanes (own fleet vs external)
ROLE
You are adapting a Valiterm ShippingProfile (lanes) and LaneSelection for bulky shipments.
WHAT I WILL PROVIDE
- I paste the original ShippingProfile and LaneSelection JSON from the Starter Kit below this prompt.
- I also provide my region/capacity choices in brackets.
INPUTS
- REGIONS_SPECIFIC_TO_BROAD: [e.g., DK-CPH, DK-ZEALAND, DK-FYN, DK-JUT, DK]
- OWN_FLEET_REGIONS: [e.g., DK-CPH]
- EXTERNAL_CARRIERS: ["External carrier A","External carrier B","External carrier C","External carrier (fallback)"]
- OPTIONAL_LOCAL_LABEL: add a second name field like "name-da" with a short Danish label.
RULES
1) Keep "@context":"https://valiterm.org".
2) In ShippingProfile, define one ShippingLane per region in the given order (most specific → broad fallback).
- For regions in OWN_FLEET_REGIONS, set the method to own-fleet (crane).
- For the others, set method to the matching external carrier name.
3) In LaneSelection.forService.BULKY.regionPreference use the same region order (most specific → broad).
4) Keep the provided labelId for bulky, and add OPTIONAL_LOCAL_LABEL if present.
5) OUTPUT: return TWO JSON objects, in this order:
1) ShippingProfile
2) LaneSelection
AI adaptation prompt — Service capacity & appointment windows
ROLE
You are adapting:
A) an OrderCutoffPolicy for appointments (clockAnchor = booking.confirmedAt)
B) a ServiceProfile with capacity and appointment windows
WHAT I WILL PROVIDE
- I paste the original ServiceCutoff and ServiceProfile JSON from the Starter Kit below this prompt.
- I also provide my choices in brackets.
INPUTS
- TIMEZONE: [Europe/Copenhagen | Europe/Stockholm | …]
- ON_SITE_REGIONS: [e.g., DK-CPH] // on-site jobs
- REMOTE_REGIONS: [e.g., DK] // remote support
- ON_SITE_CAPACITY: jobs/day Mon..Fri [6,6,6,6,4]
- REMOTE_CAPACITY: hours/day Mon..Fri [6,6,6,6,6]
- ON_SITE_WINDOWS: ["08:00–12:00","12:00–16:00"]
- REMOTE_WINDOWS: ["09:00–12:00","13:00–17:00"]
- CUTOFF_TIME: [15:00]
RULES
1) Keep valid JSON; do not change property names.
2) In the cutoff policy, set "clockAnchor":"booking.confirmedAt", TIMEZONE and CUTOFF_TIME.
3) In ServiceProfile, define lanes for ON_SITE_REGIONS (mode ON_SITE) and REMOTE_REGIONS (mode REMOTE) with given capacities and windows.
4) OUTPUT: return TWO JSON objects:
1) OrderCutoffPolicy (id "#service-cutoff")
2) ServiceProfile (id "#service-profile")
AI adaptation prompt — ShippingIndex
ROLE
You are adapting a Valiterm ShippingIndex that references the other blocks on the page.
WHAT I WILL PROVIDE
- I paste the original ShippingIndex JSON from the Starter Kit below this prompt.
- I will confirm the final @id values you should link to.
INPUTS
- MATRIX_ID: [#shipping-matrix]
- BUSINESSPROFILE_ID: [#business-profile]
- CLOSUREPOLICY_ID: [#closure-policy]
- CUTOFF_ID: [#policy-cutoff]
- LANESELECTION_ID: [#lane-selection or #lane-selection-bulky-dk]
- OPTIONAL_PROFILE_BULKY_ID: [#profile-bulky or #profile-bulky-dk]
RULES
1) Keep "@context":"https://valiterm.org", "@type":"ShippingIndex", "@id".
2) Update "matrices" and "links" to the final IDs above.
3) OUTPUT: return ONE JSON object (the adapted ShippingIndex).
Bulky lanes – Copenhagen first, then wider Denmark
Example with own fleet in Copenhagen (first choice), then external carriers for Zealand, Funen, Jutland, and a final country fallback. Labels include a Danish variant to show localization.