> ## Documentation Index
> Fetch the complete documentation index at: https://v0.x-docs.novu.co/llms.txt
> Use this file to discover all available pages before exploring further.

# PHP quickstart

> Use Novu to send multi-channel (SMS, Email, Chat, Push) notifications from a PHP app.

Learn how to use Novu to quickly send multi-channel (SMS, Email, Chat, Push) notifications from a PHP app.

## Requirements

To follow the steps in this quickstart, you'll need:

* A Novu account. [Sign up for free](http://web.novu.co/?utm_campaign=docs-gs-quick-php) if you don’t have one yet.
* A working PHP development environment with a PHP version of 7.2+.

You can also [v](https://cloudinary.com/documentation/php_quickstart#view_the_completed_code)[iew the completed code](https://github.com/novuhq/novu-php-quickstart) of this quick start in a GitHub repo.

## Install Novu PHP SDK

The [PHP SDK](http://github.com/novuhq/novu-php) provides a fluent and expressive interface for interacting with Novu's API and managing notifications.

Now install the Novu PHP SDK by running the following command in your terminal:

```bash theme={null}
composer require unicodeveloper/novu

```

Otherwise, create a file named `composer.json` and add the following to it:

```php theme={null}
{
    "require": {
        "unicodeveloper/novu": "^1.0"
    }
}

```

Next, install the SDK by running the following `composer` command:

```bash theme={null}
composer install

```

## Initialize & Configure the Novu SDK

Create a new file, `index.php` in your application and add the following code to it:

```php theme={null}
<?php

  require('vendor/autoload.php');

  use Novu\SDK\Novu;

$apiKey = '<NOVU_API_KEY>';
$novu = new Novu($apiKey);
```

Replace the `$apiKey`’s value with the authentic key from the **API Key** section of your [Novu Dashboard](https://web.novu.co/settings?utm_campaign=docs-quick-php).

<Note>
  Please do not hardcode your credentials in a file in production. Use environment variables instead.
</Note>

## Set Up A Channel Provider

A channel provider is a service that provides one or more notification functionality such as sending an email, SMS, push notification etc. Our [integration store](https://web.novu.co/integrations?utm_campaign=docs-quick-php) includes four channels: Email, SMS, Chat, and Push. These channels have multiple providers associated with them.

| Channel | Providers                                                           |
| ------- | ------------------------------------------------------------------- |
| Email   | MailGun, Mandrill, MailJet, Amazon SES, Sendgrid, Postmark, Netcore |
| SMS     | Twilio, Amazon SNS, Plivo, SMS, SMSCentral, Kannel, Infobip, Termii |
| Chat    | Mattermost, Slack, Microsoft Teams, Discord                         |
| Push    | FCM, APNS, Expo                                                     |

Only one provider can be **active** per **channel**. Connect any of your favourite providers to get started. The email channel comes with Novu's email provider, which is active by default and includes 300 credits.

## Create A Workflow

A workflow is a blueprint for the notifications that will be sent. It holds the entire flow of messages sent to the subscriber. This is where all the different channels are tied together under a single entity.

The workflow includes the following:

* Workflow name and Identifier
* Channel-tailored content:

| Channel<br /><br /> | Content Style<br /><br /> | Custom Variables<br />`{{handlebars}}` format |
| ------------------- | ------------------------- | :-------------------------------------------: |
| **Email**           | HTML                      |                       ✅                       |
|                     | Visual Editor             |                       ✅                       |
| **SMS**             | Text                      |                       ✅                       |
| **Chat**            | Text                      |                       ✅                       |
| **In-App**          | Text                      |                       ✅                       |
| **Push**            | Text                      |                       ✅                       |

<Note>
  Proper authorization needs to be set for the Chat channel for subscribers.
</Note>

Please proceed to create a workflow.

1. Click **Workflows** on the left sidebar of your Novu dashboard.
2. Click the **Create Workflow** button on the top right.
3. The name of the new workflow is currently **Untitled.** Rename it to a more suitable title.
4. Select **Email** as the channel you want to add.

<Frame caption="Choose email as the channel you want to add">
  <img src="https://mintcdn.com/novu-v2-docs/vgBgpur1s6gL5HkB/images/email-nodejs.png?fit=max&auto=format&n=vgBgpur1s6gL5HkB&q=85&s=35b0ae40b501a1a0bcd655e8f3acbd28" width="2000" height="1165" data-path="images/email-nodejs.png" />
</Frame>

5. Click on the recently added channel, fill the email subject and click “Update”.

<Frame caption="Fill in email subject">
  <img src="https://mintcdn.com/novu-v2-docs/vgBgpur1s6gL5HkB/images/email2-nodejs.png?fit=max&auto=format&n=vgBgpur1s6gL5HkB&q=85&s=f8d527b9f48e086932bc85594706659e" width="2000" height="1682" data-path="images/email2-nodejs.png" />
</Frame>

6. Click on the “Test” tab and send a test email to verify your workflow.

<Frame caption="Send test email to verify your workflow">
  <img src="https://mintcdn.com/novu-v2-docs/vgBgpur1s6gL5HkB/images/email3-nodejs.png?fit=max&auto=format&n=vgBgpur1s6gL5HkB&q=85&s=5b52e54f06c0722fcd0211f2a0f28c3f" width="2000" height="1411" data-path="images/email3-nodejs.png" />
</Frame>

You should get an email within seconds. Yaaay, you have successfully sent your first notification via the Novu dashboard! Now, let’s take it a step further to trigger notifications via code.

## Create A Subscriber

The recipients of a triggered notification are called subscribers.

Click “Subscribers” on the left sidebar of the Novu dashboard to see all subscribers. By default, the dashboard will display a subscriber, as you were added automatically during sign-up.

<Frame caption="Subscribers from the left sidebar shows all the subscriber">
  <img src="https://mintcdn.com/novu-v2-docs/rGvFx0oDoBLPCuxk/images/quickstarts/common/sub-nodejs.png?fit=max&auto=format&n=rGvFx0oDoBLPCuxk&q=85&s=b9f861bdabce3e746d9181b81e104d21" width="2000" height="933" data-path="images/quickstarts/common/sub-nodejs.png" />
</Frame>

Now, let's create a subscriber on Novu. Copy and paste the following code to do so:

```php theme={null}
// Create subscriber
$novu->createSubscriber([
    'subscriberId' => '7789', // replace with system_internal_user_id
    'email' => 'abc@gmail.com',
    'firstName' => 'John', // optional
    'lastName' => 'Doe', // optional
])->toArray();
```

Run the code in your terminal like so:

```bash theme={null}
php index.php

```

You should see the subscriber on your Novu dashboard.

<Frame caption="Subscribers list shows newly added subscriber">
  <img src="https://res.cloudinary.com/dxc6bnman/image/upload/f_auto,q_auto/v1685466979/guides/Screenshot_2023-05-14_at_11.06.38_ugvmc0.png" />
</Frame>

I’d like to publicly announce that `abc@gmail.com` is a random unlikely email your users will have. To update this to an alternative email, you can call the `updateSubscriber` method like so:

```php theme={null}
// Update subscriber detail
$subscriberId = '7789';
$novu->updateSubscriber($subscriberId, [
    'email' => 'validemail@gmail.com',  // replace with valid email
    'firstName' => '<insert-firstname>', // optional
    'lastName' => '<insert-lastname>', // optional
])->toArray();
```

Other valid fields that can be updated are `phone`, `avatar`, and `data`. The `data` field can accept an array of metadata that you want to attach to the subscriber.

<Note>
  To make all of your app users subscribers, you need to programmatically add them to Novu.
</Note>

## Trigger A Notification

Copy and paste the following code into your app to trigger a notification:

```php theme={null}
$novu->triggerEvent([
    'name' => 'first-email',
    'payload' => ['first-name' => 'Adam'],
    'to' => [
        'subscriberId' => '7789'
    ]
])->toArray();
```

Before running the code, make sure you understand the following:

* The value of `name` should be the workflow’s trigger ID/slug.

<Frame caption="Make sure your workflow's trigger ID/slug matches the value you'd used">
  <img src="https://mintcdn.com/novu-v2-docs/rGvFx0oDoBLPCuxk/images/template-nodejs.png?fit=max&auto=format&n=rGvFx0oDoBLPCuxk&q=85&s=2021841772a344d9bd5f87eb4ddaf524" width="2000" height="1059" data-path="images/template-nodejs.png" />
</Frame>

* The value of `payload` is an array of the data that you want to be dynamically injected into the workflow content.
* The value of `subscriberId` is the id of the subscriber on Novu. Replace `7789` with your subscriber ID.

Run the code to trigger a notification!

```php theme={null}
php index.php

```

Next, we’ll learn how to send notifications to different groups of subscribers easily via **Topics.**

## Topics

Novu provides a simple API that offers an easy interface for triggering notifications to multiple subscribers at once. This API is called **Topics** and allows users to manage their bulk notifications without having to implement complex loops.

A topic is identified by a custom key and this key will be the identifier used when triggering notifications. You can assign a name to a topic for descriptive purposes. This name does not need to be unique and can be changed programmatically.

<Note>
  The topic key should be unique and can't be changed once chosen. Novu also safeguards for key uniqueness behind the scenes.
</Note>

A topic can have multiple subscribers who will receive a notification whenever a message is sent to the topic.

## Create a Topic

Copy and paste the following code into your app to create a topic:

```php theme={null}
// Create a Topic
$novu->createTopic([
  'key'  => 'frontend-users',
  'name' => 'All frontend users'
]);
```

Before running the code, make sure you understand the following:

* When creating a `key`, ensure it is unique and accurately identifies the topic. Document naming conventions and communicate them to team members to avoid confusion and ensure a smooth workflow.
* The value of `name` should be a descriptive topic name.

## Add subscribers to a Topic

Copy and paste the following code into your app to add subscribers to a topic:

```php theme={null}
$topicKey = 'frontend-users';
$subscribers = [
    '6460925ce1a93324257d2fc1',
    '7789'
];

// Add subscribers to a topic
$novu->topic($topicKey)->addSubscribers($subscribers);
```

On the other hand, if you want to remove subscribers from a topic, do the following:

```php theme={null}
$topicKey = 'frontend-users';
$subscribers = [
    '6460925ce1a93324257d2fc1',
    '7789'
];

// Remove subscribers from a topic
$novu->topic($topicKey)->removeSubscribers($subscribers);
```

## Sending a notification to a Topic

Thanks to the topics feature, it is possible to trigger a notification to all subscribers assigned to a topic. This helps avoid listing all subscriber identifiers in the `to` field of the notification trigger.

To trigger a notification to all subscribers of a topic, copy and paste the code below:

```php theme={null}
// Send notifications to a topic (all frontend users)
$novu->triggerEvent([
    'name' => 'first-email',
    'to' => [
       [
         'type' => 'Topic',
         'topicKey' => 'frontend-users'
       ]
    ]
])->toArray();
```

## Conclusion

Great job! If you've reached this point, you should now have successfully created a subscriber, workflow, configured a channel provider and triggered a notification in your application.
