← All playbooks · Raw API

articles

# Articles — HopSkipDrive

## Routing (multi-type)

HopSkipDrive is **not** a single-base blog. Article **types** map to different public URL prefixes. Primary blog is the largest surface (~575 URLs).

| Concept | Value |
|---------|-------|
| Primary articles slug | `blog` |
| Primary public base | `/blog` |
| Tags hub | `/tags` (index) |
| Blog tag listings | `/blog/tag/{slug}/` (not `/tags/{slug}/` for chips — see redirects) |
| Primary tag in article URL | **No** — flat article slugs under the type base |
| Article type index pages | **Enabled** (`enableArticleTypeIndex`) |

| Article type slug | Public base (typical) | Notes |
|-------------------|----------------------|--------|
| `blog` | `/blog/{slug}/` | Default editorial posts |
| `clients` | `/clients/…` | Client stories |
| `report` | `/report/…` | Reports / safety reports |
| `webinar` | `/webinar/…` | Webinars (index also `/webinars`) |
| `event` | `/events/…` | Events |
| `featured-press-item` | `/featured-press/…` | Press items |
| `caredriver-event` | `/caredriver-events/…` | CareDriver events |
| `newsletter` | type-specific | Newsletter archive items |

Always set **`articleType`** to the correct type before publish. Wrong type → wrong URL family.

Read `cms-edit://customer/routing` for pack-generated constants. Markdown access for primary articles: `/blog/{slug}.md` (other types may differ).

### Tags

| Path | Role |
|------|------|
| `/tags/` | Tags hub index (if enabled) |
| `/blog/tag/{slug}/` | **Canonical** blog tag listing (legacy parity) |
| `/tags/{slug}/` | Redirects → `/blog/tag/{slug}/` |

When linking tags from articles or components, prefer **`/blog/tag/{slug}/`**.

## Article type vs tags

| Field | Contentful type | Usage |
|-------|-----------------|--------|
| `articleType` | `articleType` | **Required.** Chooses URL family and listing index. |
| `tags` | `tag` (many) | Topics/filters for blog and related content. |
| `authors` / `author` | `person` | Prefer **`authors`** array; see `people` playbook. |

Do not confuse **article type** (blog vs webinar vs report) with **tags** (topic labels).

## Common article components

High-usage types from the CMS audit — see `components-index`:

| Role | Typical type |
|------|----------------|
| Article hero / dek | **Article description** |
| Body | **Blog content** (and related rich-text article body types) |
| Quotes | **Large Quote**, **Small Quote** |
| Share / utility | Site-specific share components on templates |

Prefer cloning a recent article of the **same article type** rather than inventing a new stack.

## Listing and discovery

```bash
cms-edit list --type article --sort date -n 20
cms-edit list --type article --has-field tags
cms-edit list --type tag
cms-edit list --type articleType
```

Articles sort by publication `date`, not `sys.updatedAt`.

## Reading article fields

```bash
cms-edit open --article-slug <slug>
cms-edit read @root
cms-edit read @root tags
cms-edit read @root articleType
```

Use `@root` for the article entry itself (not a content component).

## Setting tags on an article

Tags are an **array of entry links**. Resolve tag slugs to entry IDs first:

```bash
cms-edit list --type tag --json
```

Then open the article and replace the full `tags` array:

```bash
cms-edit open --id <article-entry-id>
cms-edit set @root tags <tagId1>,<tagId2>,<tagId3> --links
cms-edit diff
cms-edit save
```

Use comma-separated **entry IDs** (no spaces). Empty value clears tags: `cms-edit set @root tags --links` with no IDs.

## Creating articles

1. Read `cms-edit://customer/task-create-article` (and this playbook)
2. Confirm **article type** and public URL family
3. Set `title`, `slug`, `date`, `description`, `featuredImage`, `articleType`
4. Build body components; set `cmsLabel` after each add
5. Link `authors` to person entries when bylines are required
6. `diff` → `save` → preview

**Featured images:** Read `cms-edit://customer/defaults` (site default asset when no custom image). Prefer authentic HSD photography already in CMS.

## SEO

- `title` / `description` specific to the piece; include brand terms correctly (CareDriver, RouteWise AI™)
- `featuredImage` for social
- Do not invent safety or outcome statistics — pull from published reports / approved copy

## Publish handoff

`save` creates **drafts only**. Publish in Contentful UI when approved. See `cms-edit://customer/task-publish-handoff`.

## Out of scope

- Marketing **pages** (hubs, offerings, programs) → `pages` / `audience-hubs`
- **Location** city entries → `location-pages`
- Legal documents masquerading as blog posts