export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
export default function Page() {
const [data, setData] = useState(null)
useEffect(() => {
fetch('/api/leads')
.then(r => r.json())
.then(setData)
}, [])
return <Dashboard data={data} />
}
async function sendEmail(payload) {
await resend.emails.send({
from: 'hello@firma.pl',
to: payload.email,
subject: 'Dziękujemy za kontakt',
})
}
export const config = {
runtime: 'edge',
regions: ['fra1'],
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
.hero {
display: grid;
grid-template-columns: 1fr 460px;
gap: clamp(2rem, 4vw, 4rem);
align-items: center;
}
@media (max-width: 1024px) {
.hero { grid-template-columns: 1fr; }
}
const stripe = new Stripe(process.env.SK)
export async function POST(req) {
const sig = req.headers.get('stripe-signature')
const event = stripe.webhooks.constructEvent(
await req.text(), sig, process.env.WH
)
if (event.type === 'checkout.session.completed') {
await db.orders.create({ data: event.data })
}
return Response.json({ ok: true })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}
import { z } from 'zod'
const LeadSchema = z.object({
name: z.string().min(2),
email: z.string().email(),
message: z.string().min(10),
})
const db = new PrismaClient()
await db.lead.create({
data: {
...validated,
source: req.headers.get('referer'),
createdAt: new Date(),
}
})
export async function syncToCRM(lead) {
await hubspot.crm.contacts.basicApi
.create({ properties: lead })
}