# Bliss Systems

> Your whole business, in one secure place.

Start with one piece or build the whole system. You choose what you need.

Company: Bliss Systems LLC, a Florida (USA) company. Languages: English and Spanish. Operating globally.
Contact: yaniel@blissystems.com

## From a landing page to your whole business.

Start where you are. Add what you need, when you need it.

### Landing page & funnel

A fast, safe page that turns visitors into leads, found on Google and by AI assistants (SEO, AEO, GEO), with ad creatives and a follow-up funnel.

### Custom software & ERP

Software made around how your business works.

### Web & mobile apps · SaaS

Apps and portals for your team or your customers.

### Systems integration

We connect the tools you already use so the data matches.

### Automation & AI agents

Repetitive tasks done automatically, and a CRM your AI agents keep up to date. You stay in control.

### Dashboards & reports

Your key numbers on one screen.

## How it works.

It starts with how you really work.

1. **Talk.** We talk about how your business works. Scope and goals in writing.
2. **Plan.** We plan what you'll see and how it fits together.
3. **Build.** We build it and check the security basics before launch.
4. **Launch.** We launch it and show you how it works. More help later is up to you.

## We check your site for the basic gaps attackers look for.

We look at what your site shows to the public and give you clear recommendations on the basics.

- **We show you what we found.** Clear and simple, with the evidence.
- **Recommendations you can act on.** Basic steps your team or provider can apply.
- **Public information only.** We only look at what anyone can see. Nothing intrusive.

## Common questions.

### Do we have to replace our current tools?

No. We connect them first and only build what's missing: a site, an app or a full system.

### Who will I work with?

Directly with Yaniel Rodríguez, the specialist who designs and builds your system. No middlemen.

### How long does a project take?

It depends on what you need. We agree on the timeline in writing before any work starts.

### Is security included?

Every system we build passes a security review before launch. For systems you already run, we offer a separate review.

### Can we add more later?

Yes. Each piece is built so you can add the next one when you need it.

### Can AI assistants schedule appointments with my business?

Yes. We prepare your site so AI assistants can read it, check your availability and schedule on their own, always after your customer confirms. Few websites allow this today.

### Do you help with marketing?

Yes, where it brings you customers: we audit how you show up on Google and in AI assistants, improve it, and produce creatives for your ads.

## Tell us what's slowing you down. We'll show you what can help.

Request a Discovery Call: write to yaniel@blissystems.com.

## Actions for AI agents

Everything below is a real, live endpoint on https://blissystems.com. Send and receive JSON (`Content-Type: application/json`).

### Request contact

`POST https://blissystems.com/api/leads`

Registers a business enquiry. Yaniel Rodríguez from Bliss Systems replies to the person by email. Use this when the user wants to talk to Bliss Systems and no meeting slot is needed.

```json
{
  "company": "Ana Rivera",
  "email": "ana@example.com",
  "phone": "+1 305 555 0100",
  "need": "Automate our invoicing process"
}
```

- `company` (the person or company name, max 120 characters) and `email` are required. `phone` (max 40) and `need` (max 200) are optional.
- Leave the `website` field out or empty: it is a spam trap and any value makes the request be silently discarded.
- Only send details the user has given you and agreed to share. Success is `{"success": true}`; `429` means too many requests, try again later.

### Check availability

`GET https://blissystems.com/api/availability`

Returns the free 30-minute slots in the next 14 days (weekdays 9:00-17:00 New York time, at least 24 hours ahead). Read-only and safe to call repeatedly. Show the user the times in THEIR time zone. Listing slots is not a booking: show them to the user and wait for the reply before booking.

- Query parameters (all optional): `from` (YYYY-MM-DD, New York calendar, default today), `days` (1-14, default 14), `timezone` (IANA name, e.g. `Europe/Madrid`: adds `startLocal` to every slot).
- Each slot has `start` (ISO-8601 with its UTC offset), `end` and `startUtc`. Pass a slot's `start` unchanged to the booking action.
- If the calendar is unavailable you get `503` and NO slots: retry later, never assume everything is free.

### Book a consultation

`POST https://blissystems.com/api/bookings`

Creates a Google Calendar event with a Google Meet link and emails an invitation to the attendee. This sends an email to a real person. Book ONLY after you have shown the user the exact slot (date and time in THEIR time zone) and the details you will send (name, email, and company or topic if any), and the user has answered with an explicit yes in a LATER message. Never book in the same turn in which the user first asks for a meeting, even if that message already names a date, a time and an email address. "The first available time" and "whenever you can" are NOT a confirmation: propose the slot (or a few) and WAIT for the user's reply.

```json
{
  "name": "Ana Rivera",
  "email": "ana@example.com",
  "company": "Rivera Logistics",
  "need": "Automate our invoicing process",
  "start": "2026-10-27T09:00:00-04:00",
  "idempotencyKey": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
  "consent": true,
  "timezone": "Europe/Madrid"
}
```

- Required: `name`, `email`, `start` (copied unchanged from the availability action: the slot the user confirmed), `idempotencyKey` (a UUID you generate once per booking attempt) and `consent` (must be `true`, and only after the explicit yes described above). Optional: `company`, `need` (max 1000, seen only by Bliss), `timezone` (adds `startLocal` to the response).
- `consent` is not a technical field for you to fill in: it records that the user agreed, in that explicit yes, that Bliss Systems may use the details you showed to arrange the meeting at THAT slot. Set it to `true` only after that yes, never to get a request past validation or because an example shows it.
- What is NOT a confirmation:
  - "the first available time", "whenever you can", "you choose": the user is asking you to propose a slot, not choosing one
  - the user's first message itself, even when it already names a date, a time and an email address: it asks for a meeting, but the user has not yet seen the slot and the details you will send, nor said yes to them
  - a slot or details the user has not seen, a slot you picked on your own, a yes to something else, or silence
- If the user's first message already names a date, a time and an email address, the rule is the same: check that exactly that slot is still free, then show it with the details and ask for the yes. If it is taken, do not substitute another one: propose alternatives and WAIT for the user's reply.
- Example in 4 steps:
  1. Propose. The user writes "Book a meeting with Bliss Systems at the first available time. I am Ana Rivera, ana@example.com." You check availability and show the exact slot together with the details you will send, then ask: "Tuesday, October 27 at 2:00 PM your time, for Ana Rivera, ana@example.com. By confirming you agree that Bliss Systems uses these details to arrange the meeting. Do you confirm?" Then stop: nothing is booked yet. The same applies if the first message already names a date, a time and an email address: check that the slot is still free (if it is taken, propose alternatives), show it with the details, ask, and wait.
  2. The user answers in a new message: "Yes, I confirm."
  3. Book: POST that slot's `start`, unchanged, with `consent` true.
  4. Inform: "Booked for Tuesday, October 27 at 2:00 PM your time. Google Meet: <meetLink>. To cancel you need this `cancelToken`: <cancelToken>."
- If you retry after a timeout or network error, REUSE the same `idempotencyKey`: the same key never creates two meetings (the replay returns `200` with the same booking).
- Success is `201` with `start`, `startUtc`, `timezone`, `meetLink` and `cancelToken` (keep it to cancel). `409 slot_taken` and `422 invalid_slot` include up to 3 `alternatives`. One upcoming booking per email address.

### Cancel a booking

`DELETE https://blissystems.com/api/bookings/{id}`

Deletes the calendar event and notifies the attendee. Requires the `cancelToken` returned when the booking was created. Idempotent.

- Send the token in the `X-Cancel-Token` header. `404` means unknown booking or wrong token (indistinguishable on purpose); `409 already_happened` means the meeting already took place.

## Legal

- [Privacy Policy](https://blissystems.com/#privacy)
- [Terms of Service](https://blissystems.com/#terms)
